2016-03-01 185 views
2

我需要幫助解決其中一個問題。我是XSLT新手。現在我正在嘗試編寫一個將生成文本輸出的XSLT(例如:「01:30」)。 在我的XSLT 2.0,我打電話的XPath函數hours-from-duration($duration)而這個函數拋出錯誤

XPath是無效

我還可以看到上面的錯誤在以下日誌。請幫我解決我的問題。感謝...

16:01:39403 ERROR [主要] JAXPSAXProcessorInvoker - 錯誤檢查類型表達的 'funcall(小時從持續時間,[可變REF(持續時間/節點集)])' 。

16:01:39404 ERROR [主要] JAXPSAXProcessorInvoker - 無法編譯樣式表

javax.xml.transform.TransformerConfigurationException:在com.sun.org.apache.xalan.internal.xsltc無法編譯樣式表。 trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:858)在com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:648)

我的XSLT:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:date="http://exslt.org/dates-and-times" 
    xmlns:str="http://exslt.org/strings" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    version="1.0" xmlns:xalan="http://xml.apache.org/xslt"> 
    <xsl:output method="text" /> 
    <xsl:variable name="request" select="/*[local-name()='Payout']/*[local-name()='Request']" /> 
    <xsl:variable name="duration" select="$request/Time" /> 

    <xsl:template match="/"> 
     <xsl:value-of select="(hours-from-duration($duration))"/> 
     <xsl:text>:</xsl:text> 
     <xsl:value-of select="(minutes-from-duration($duration))"/> 
    </xsl:template> 
</xsl:stylesheet> 

XML輸入:

<Payout> 
<Request Commit="true" Transaction="false"> 
    <Month>JAN</Month> 
    <Time>P01H30M33S</Time> 
</Request> 
</Payout> 
+1

哪裏是'$ duration'設置? – kjhughes

回答

0

你的持續時間值是無效的。它缺少一個「T」。它應該是PT01H30M33S

0

hours-from-duration()是一個XPath 2.0函數。您正在使用Xalan,它僅支持XSLT 1.0和XPath 1.0。

此外,這些函數需要一個xs:duration類型的對象。你傳遞一個節點(一個時間元素)。如果切換到XSLT 2.0處理器,則需要(a)確保處理器能夠識別架構,並將時間驗證爲xs:持續時間,或者(b)通過調用xs:duration(Time)將其明確轉換爲xs:duration

當然,你需要確保它是一個有效的持續時間所指出的@MadsHansen

+0

感謝您的輸入.......我剛剛運行了下面的代碼,並在日誌中給出了不同的錯誤消息(注意:我在請求XML PT01H30M33S中添加了T): - 請您查看我的代碼並讓我我在哪裏犯錯。 - 切換到XSLT2.0處理器,我需要做什麼。 – ani

+0

我在評論部分添加了最新的xsl。 Plz看看。謝謝... – ani

+0

對不起,我想我解釋過。 Xalan是一款XSLT 1.0處理器。它不瞭解XSLT 2.0。要從Java運行XSLT 2.0,請改用Saxon。 –