2016-12-14 241 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

謝謝你的見解,馬丁。說得通。 –