将xsl变量传递给javascript函数
使用带有msxsl的exslt.org中的date:difference函数。 如果我使用字符串文字,那么函数工作正常。 但是,如果我从xml文件中获取字符串并将其放入变量中,然后将这些变量用于“difference”函数,则会出现以下错误:将xsl变量传递给javascript函数,javascript,function,variables,xslt,msxsl,Javascript,Function,Variables,Xslt,Msxsl,使用带有msxsl的exslt.org中的date:difference函数。 如果我使用字符串文字,那么函数工作正常。 但是,如果我从xml文件中获取字符串并将其放入变量中,然后将这些变量用于“difference”函数,则会出现以下错误: msxsl.exe dummy.xml dateDifftest.xsl -o diffOut.html Error occurred while executing stylesheet 'dateDifftest.xsl'. Code: 0x800
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文件中提取字符串
那么,第三次测试的变量与第二次测试的变量有何不同呢
如果我注释掉第三个测试的函数调用,这是输出:
测试-1PT2M1S
测试-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>
测试-1
测试-2
测试-3
输入xml文件:
<A>
<B>
<C>
<start>2011-12-13T16:15:26</start>
<end>2011-12-13T16:17:27</end>
</C>
</B>
</A>
2011-12-13T16:15:26
2011-12-13T16:17:27
谢谢查看您链接到的源代码我看到了
<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)"/>
它正在为我工作。。。使用xlstproc而不是msxsl。请尝试xsltproc-o diffOut.html dateDifftest.xsl dummy.xmlI在另一篇文章中使用这个exslt.org脚本时被告知,该脚本将与msxsl一起使用。因此,我不确定“如果另一个处理器不工作,就使用另一个处理器”是否是正确的方法。特别是如果我打算使用该脚本中的更多函数。但我是xsl新手,所以非常感谢您的见解。同意,我也不确定这是正确的方法。在这种情况下,为什么不将其标记为msxsl,以引起了解msxsl的人的注意……好主意。will doWhy这是带标签的javascript吗?我看到日志中有一个“MicrosoftJScript运行时错误”,但是JScript是如何涉及的,JScript真的是javascript吗?他们两个有关系吗?太好了!那是一个神奇的时刻!所以select=“start”分配的不仅仅是字符串值?!我有很多东西要学。谢谢看起来select=“start”使xsl处理器猜测值的数据类型。处理器猜测这是一个日期,但exsl函数需要一个字符串,因此它会中断。而select=“string(start)”显式地将数据类型设置为string。有道理。我完全不同意“它看起来像select=“start”使xsl处理器猜测值的数据类型”的解释。XPath和XSLT数据类型在相关规范中有明确定义,没有猜测,表达式start
选择上下文节点的start
子元素,因此给定
变量持有类型为node set的值。而像concat
这样的内置函数无论是concat(start'bar')
还是concat('foo','bar'),都可以正常工作
对于扩展函数,这取决于实现者。当然,这取决于特定的XSLT处理器和向扩展函数公开的API是否只能传递原子值(如数字或字符串)或节点(-set)。使用MSXML可以传入节点,但需要编写扩展函数来处理它们。