得到错误" XPath无效"从"持续时间($持续时间)"

时间:2016-03-01 22:12:19

标签: xslt xslt-2.0 xpath-2.0

我的一个问题需要帮助。我是XSLT的新手。现在我正在尝试编写一个XSLT,它将生成文本输出(例如:" 01:30")。 在我的XSLT 2.0中,我调用XPath函数hours-from-duration($duration)并且此函数抛出错误

  

XPath无效

我还可以在以下日志中看到上述错误。请帮我解决我的问题。感谢...

  

16:01:39,403 ERROR [main] JAXPSAXProcessorInvoker - 错误检查表达式的类型&f; funcall(从持续时间开始,[variable-ref(持续时间/节点设置)])'。

     

16:01:39,404 ERROR [main] JAXPSAXProcessorInvoker - 无法编译样式表

     

javax.xml.transform.TransformerConfigurationException:无法在com.sun.org.apache的com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:858)编译样式表.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>

2 个答案:

答案 0 :(得分:1)

您的持续时间值无效。它缺少一个“T”。它应该是PT01H30M33S

答案 1 :(得分:1)

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

此外,这些函数需要xs:duration类型的对象。您正在传递一个节点(Time元素)。如果切换到XSLT 2.0处理器,则需要(a)确保处理器具有模式感知功能,并将Time验证为xs:duration,或者(b)将其明确转换为xs:duration类型,致电xs:duration(Time)

当然,你需要确保它是有效的持续时间,如@MadsHansen指出