2016-12-14 183 views
1

使用来自exslt.org date.msxsl.xsl和msxsl的日期:差异函数。 如果我使用字符串文字,那么该函数工作正常。 但是,如果我抓住从XML文件中的字符串,并把它们放到变量,然后使用这些变量的“差”功能,我得到以下错误:将xsl变量传递给javascript函数

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文件中提取字符串。

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

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

TEST-1
PT2M1S
TEST-2
2011-12-13T16:15:26
2011-12-13T16:17:27
PT2M1S
TEST-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> 

谢谢

+0

这是源为我工作...使用xlstproc而不是msxsl。尝试xsltproc -o diffOut.html dateDifftest.xsl dummy.xml –

+0

我被告知使用此exslt.org脚本的其他帖子,该脚本旨在与msxsl一起使用。所以我不确定是否应该'只是使用另一个处理器,如果这个不工作' - 是正确的方法。特别是如果我打算使用该脚本中的更多功能。但我对xsl很陌生,因此非常感谢任何见解。 –

+0

同意,我不知道这是正确的方法。在这种情况下,为什么不把它标记为msxsl,以便从知道msxsl的人那里获得关注... –

回答

2

看着你链接到我看到

<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)"/> 
+0

优秀!那是神奇的时刻!因此,select =“start”不仅仅指定字符串值?我有很多东西需要学习。谢谢! –

+0

看起来像select =“start”会使xsl处理器猜测值的数据类型。处理器猜测它是一个日期,但exsl函数期望一个字符串,所以它会中断。而select =“string(start)”明确地将数据类型设置为字符串。 –

+0

谢谢你的见解,马丁。说得通。 –