2016-03-01 184 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。 –