【问题标题】:Getting error "XPath is invalid" for "hours-from-duration($duration)"为“hours-from-duration($duration)”获取错误“XPath 无效”
【发布时间】:2016-03-01 22:12:18
【问题描述】:

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

XPath 无效

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

16:01:39,403 错误 [main] JAXPSAXProcessorInvoker - 检查表达式“funcall(hours-from-duration, [variable-ref(duration/node-set)])”的类型时出错。

16:01:39,404 错误 [main] 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>

【问题讨论】:

  • $duration 设置在哪里?

标签: xslt xslt-2.0 xpath-2.0


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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 指出的有效持续时间

    【讨论】:

    • 感谢您的输入.......我刚刚运行了下面的代码并在日志中给出了不同的错误消息(注意:我在请求 XML PT01H30M33S 中添加了 T): - 请查看我的代码,让我在哪里做错了。 - 切换到 XSLT2.0 处理器我需要做什么。
    • 我在评论区添加了上面最新的 xsl。请看一下。谢谢...
    • 对不起,我想我已经解释过了。 Xalan 是一个 XSLT 1.0 处理器。它不理解 XSLT 2.0。要从 Java 运行 XSLT 2.0,请改用 Saxon。
    • @ani StackOverflow 的约定不是写 cmets 说“谢谢”,而是通过单击答案旁边的勾号/复选标记将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多