2016-12-14 154 views
0

我想按照這個答案給出了指導意見: time difference計算時間差重新

但不明白爲什麼模板方法失敗。也許它與命名空間有關。 而我不明白我的功能方法的結果。

輸入XML:

<BatchData > 
<Line> 
    <Batch> 
     <start>2011-12-13T16:15:26</start> 
     <end>2011-12-13T16:17:27</end> 
    </Batch> 
</Line> 

XSL文件:

<?xml version='1.0'?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:date="http://exslt.org/dates-and-times" 
extension-element-prefixes="date" 
> 
<xsl:include href="date.msxsl.xsl" /> 

<!-- msxsl.exe myDateTestInput.xml myDateEXSLT.xsl -o dateTestOut.html--> 
<!-- java -cp C:\XSL\SaxonHE9-7-0-14J\saxon9he.jar net.sf.saxon.Transform -t -s:myDateTestInput.xml -xsl:myDateEXSLT.xsl -o:dateTestOut.html --> 

<xsl:output method="html" /> 
<xsl:template match="/BatchData/Line/Batch"> 
    <html> 
     <head> 

     </head> 

     <body> 

       <table > 
        <tr> 
         <td> 
          <xsl:variable name="time-diff-dur"> 
          <xsl:call-template name="date:difference"> 
           <xsl:with-param name="start" select="start" /> 
           <xsl:with-param name="end" select="end" /> 
          </xsl:call-template> 
          </xsl:variable> 
          <!-- The above returns a duration formatted string, so convert that to seconds: --> 
          <xsl:variable name="time-diff-sec"> 
           <xsl:call-template name="date:seconds"> 
            <xsl:with-param name="seconds" select="$time-diff-dur" /> 
           </xsl:call-template> 
          </xsl:variable> 

          <!-- 
           <xsl:variable name="time-diff-sec" select="date:seconds(date:difference(start, end))" /> 
           <xsl:value-of select="$time-diff-sec"></xsl:value-of> 
          --> 

         </td> 

         </tr> 
       </table> 
     </body> 
    </html> 
</xsl:template> 

我同時使用msxsl和Saxon9he。他們在模板方法上都失敗了,但撒克遜至少提供了一些錯誤信息。這是使用模板的錯誤:

靜態誤差在XSL:呼叫模板上線25列51 myDateEXSLT.xsl的: XTSE0650:沒有模板存在名爲日期:區別在XSL 靜態錯誤:調用myDateEXSLT.xsl第32列第52行模板: XTSE0650:沒有指定日期的模板:秒 myDateEXSLT.xsl第31行xsl:變量的警告: SXWN9001:沒有以下兄弟指令的變量沒有效果 樣式表彙編過程中報告了錯誤

當我註釋掉模板並取消註釋函數方法時,我沒有得到任何錯誤,但不知道如何將time-diff-sec的結果顯示爲表數據值。相反,輸出只是輸入文件的2個日期時間。

我也使用「導入」而不是「包含」,但沒有任何區別。有區別嗎?

所以總結一下問題:

  1. 我做了什麼錯模板方法?
  2. 如何顯示功能方法中的 值?
  3. 'import'和'include'之間有區別嗎?

也許前者是從一個網站拉下來,而後者是爲了本地資源。

感謝。

這是文件date.msxsl.xsl。我會在這裏發佈它,因爲該exslt.org網站似乎有問題。 (重命名擴展名): date.msxsl.xsl

回答

2

在回答您的具體問題:

  1. 「我做了什麼錯模板方法?「
    <xsl:call-template>只是做的是:它由name屬性指定調用一個模板,您的XSL沒有定義命名任何模板,無論是date:differencedate:seconds,所以它自然失敗。如果這樣的模板被定義。導入或包含的文件,它可能工作,但要包括的文件不包含任何這樣的模板無論是。
  2. 「我怎麼顯示從函數逼近的價值?」
    ,而不是調用非如果存在模板,請嘗試調用該函數。請仔細閱讀的內容,它看起來像你想要的功能的確被稱爲date:difference。這是爲了與MSXSL庫一起處理的,所以確保你在使用它 - 嘗試用Saxon處理這個,例如,會拋出錯誤。我不是很瞭解微軟的XML處理堆棧,所以我不能告訴你.NET是否可以工作 - 從OxygenXML調用.NET 1.0和.NET 2.0庫的初步測試表明,.NET將不起作用。
  3. 「'import'和'include'之間有區別嗎?」
    總之,是的。請參閱Stylesheet Inclusion in the official W3 documentation部分。
    您使用上面的<xsl:include>。這需要一個有效的HREF - 基本上,一條路徑。您提供的值爲date.msxsl.xsl,因此XSL解析器將查找名爲date.msxsl.xsl的文件,該文件位於與XSL樣式表文件本身相同的目錄中。假設您將該文件保存在與您自己的XSL相同的目錄中,那麼XSL處理器將會找到它。但是,該文件也不包含任何稱爲date:differencedate:seconds的模板,因此您的call-template指令失敗。

沒有深入研究從源文件中提取日期值或在輸出中格式化它們的細節,我創建了一個超級簡單,快速且髒的示例,使用MSXSL處理時成功執行v4.0庫。

樣品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" /> 

    <xsl:template match="/"> 
     <TEST> 
      <xsl:value-of select="date:difference('2011-12-13T16:15:26', '2011-12-13T16:17:27')"/> 
     </TEST> 
    </xsl:template> 

</xsl:stylesheet> 

/的匹配是在邏輯根匹配。這匹配任何輸入,所以我不打擾在這個例子中提供任何。

還應注意xmlns:date聲明:該date前綴在includ 文件(date.msxsl.xsl)定義,但它也必須在這裏宣佈在includ荷蘭國際集團文件

示例輸出:

<TEST xmlns:date="http://exslt.org/dates-and-times">PT2M1S</TEST> 

但這似乎工作:在兩個日期時間之間的差是的確2分鐘,1秒鐘。

這應該給你一個基礎。現在,解決其餘的問題,最好在你這樣做的時候有一些有趣的學習。 :)