将xsl变量传递给javascript函数

将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的exslt.org中的date:difference函数。 如果我使用字符串文字,那么函数工作正常。 但是,如果我从xml文件中获取字符串并将其放入变量中,然后将这些变量用于“difference”函数,则会出现以下错误:

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>

测试-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可以传入节点,但需要编写扩展函数来处理它们。