【问题标题】:passing xsl variable to javascript function将 xsl 变量传递给 javascript 函数
【发布时间】:2017-04-30 02:39:02
【问题描述】:

使用来自 exslt.org date.msxsl.xsl 的 date:difference 函数和 msxsl。 如果我使用字符串文字,那么该函数可以正常工作。 但是,如果我从 xml 文件中获取字符串并将它们放入变量中,然后将这些变量用于“差异”函数,则会出现以下错误:

msxsl.exe dummy.xml dateDifftest.xsl -o diffOut.html
Error occurred while executing stylesheet 'dateDifftest.xsl'.
Code:   0x80020009
Microsoft JScript runtime error
Wrong number of arguments or invalid property assignment
line = 954, col = 3 (line is offset from the start of the script block).
Error returned from property or method call.

我在这个 xsl 中做了 3 次测试。所有 3 都使用相同的日期时间字符串。

第一次测试使用字符串文字调用函数。 第二个测试以字符串为内容的变量调用函数。 第三次测试 - 失败的测试 - 从 xml 文件中提取字符串。

那么第三次测试的变量和第二次测试的变量有什么不同呢?

如果我注释掉第三个测试的函数调用,这是输出:

测试-1
PT2M1S
测试-2
2011-12-13T16:15:26
2011-12-13T16:17:27
PT2M1S
测试 3
2011-12-13T16:15:26
2011-12-13T16:17:27

xsl 文件:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
>
<xsl:include href="date.msxsl.xsl" />

<!-- msxsl.exe dummy.xml dateDifftest.xsl -o diffOut.html -->

<xsl:template match="/A/B/C">
    <TEST1>
        TEST-1
    <br/>
        <xsl:value-of select="date:difference('2011-12-13T16:15:26', '2011-12-13T16:17:27')"/>  <!-- outputs "PT2M1S", the difference is 2 mins and 1 sec -->
    </TEST1>
    <br/>
    <TEST2> 
        TEST-2
    <br/>
        <xsl:variable name="startTime" select="'2011-12-13T16:15:26'"/>
        <xsl:value-of select="$startTime"></xsl:value-of>
    <br/>
        <xsl:variable name="endTime" select="'2011-12-13T16:17:27'"/>
        <xsl:value-of select="$endTime"></xsl:value-of> 
    <br/>
        <xsl:value-of select="date:difference($startTime, $endTime)"/>  <!-- also outputs "PT2M1S" -->
    </TEST2>
    <br/>
    <TEST3>
        TEST-3
    <br/>
        <xsl:variable name="startTime" select="start"/>
        <xsl:value-of select="$startTime"></xsl:value-of>
    <br/>
        <xsl:variable name="endTime" select="end"/>
        <xsl:value-of select="$endTime"></xsl:value-of> 
    <br/>
    <!--    <xsl:value-of select="date:difference($startTime, $endTime)"/>--> <!-- FAILS HERE -->


    </TEST3>
</xsl:template>

输入xml文件:

<A>
<B>
    <C>
        <start>2011-12-13T16:15:26</start>
        <end>2011-12-13T16:17:27</end>
    </C>
</B>
</A>

谢谢

【问题讨论】:

  • 它对我有用...使用 xlstproc 而不是 msxsl。试试 xsltproc -o diffOut.html dateDifftest.xsl dummy.xml
  • 在另一篇文章中,有人告诉我使用这个 exslt.org 脚本,该脚本旨在与 msxsl 一起使用。所以我不确定是否应该“如果另一个处理器不起作用,则只使用另一个处理器” - 是正确的方法。特别是如果我打算使用该脚本中的更多功能。但我是 xsl 的新手,所以感谢任何见解。
  • 同意,我也不确定这是否是正确的方法。既然如此,何不将其标记为 msxsl 以引起了解 msxsl 的人的注意……
  • 好主意。会做
  • 为什么这个标签是javascript?我看到日志中有一个“Microsoft JScript 运行时错误”,但是 JScript 是如何涉及的,JScript 真的是 javascript 吗?它们中的任何一个都相关吗?

标签: javascript function variables xslt msxsl


【解决方案1】:

查看您链接到的来源我看到了

<doc:args>
    <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
    <doc:arg name="date" type="string" default="''" optional="yes"></doc:arg>
</doc:args>

所以我建议尝试确保在 XSLT/XPath 端将字符串值作为参数传递

<xsl:variable name="startTime" select="string(start)"/>
    <xsl:value-of select="$startTime"></xsl:value-of>
<br/>
    <xsl:variable name="endTime" select="string(end)"/>
    <xsl:value-of select="$endTime"></xsl:value-of> 
<br/>
<xsl:value-of select="date:difference($startTime, $endTime)"/>

【讨论】:

  • 太棒了!那是神奇的时刻!所以 select="start" 分配的不仅仅是字符串值?!我有很多东西要学。谢谢!
  • 看起来 select="start" 让 xsl 处理器猜测值的数据类型。处理器猜测它是一个日期,但 exsl 函数需要一个字符串,所以它会中断。而 select="string(start)" 将数据类型显式设置为字符串。
  • 谢谢你的洞察力,马丁。有道理。
  • 我完全不同意“看起来 select="start" 使 xsl 处理器猜测值的数据类型”的解释。 XPath 和 XSLT 数据类型在相关规范中明确定义,无需猜测,表达式 start 选择上下文节点的 start 子元素,因此给定 &lt;xsl:variable name="startTime" select="start"/&gt; 变量包含节点类型的值-放。虽然 concat 等内置函数可以正常工作,但无论您使用扩展函数使用 concat(start, ' bar') 还是 concat('foo', ' bar'),这都取决于实现者。
  • 当然,这取决于特定的 XSLT 处理器和暴露给扩展函数的 API,您是否只能传递原子值,如数字或字符串或节点(-set)。使用 MSXML 可以传入节点,但需要编写扩展函数来处理它们。
猜你喜欢
  • 2016-08-21
  • 2015-05-02
  • 2018-12-14
  • 2014-10-31
  • 2020-09-02
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多