Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 获取错误“;XPath无效;至于;持续时间后的小时数($持续时间)“;_Xslt_Xslt 2.0_Xpath 2.0 - Fatal编程技术网

Xslt 获取错误“;XPath无效;至于;持续时间后的小时数($持续时间)“;

Xslt 获取错误“;XPath无效;至于;持续时间后的小时数($持续时间)“;,xslt,xslt-2.0,xpath-2.0,Xslt,Xslt 2.0,Xpath 2.0,我的一个问题需要帮助。我是XSLT新手。现在我正在尝试编写一个XSLT,它将生成文本输出(例如:“01:30”)。 在XSLT2.0中,我调用XPath函数hours from duration($duration),该函数抛出错误 XPath无效 我还可以在以下日志中看到上述错误。请帮我解决我的问题。谢谢 16:01:39403错误[main]JAXPSAXProcessorInvoker-表达式“funcall(从持续时间算起的小时,[variable ref(持续时间/节点集)]”的错误检

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

XPath无效

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

16:01:39403错误[main]JAXPSAXProcessorInvoker-表达式“funcall(从持续时间算起的小时,[variable ref(持续时间/节点集)]”的错误检查类型

16:01:39404错误[main]JAXPSAXProcessorInvoker-无法编译样式表

javax.xml.transform.TransformerConfiguration异常:无法在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>

简
P01H30M33S

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

hours-from-duration()是一个XPath 2.0函数。您使用的是Xalan,它只支持XSLT1.0和XPath1.0

此外,这些函数需要类型为
xs:duration
的对象。您正在向它传递一个节点(时间元素)。如果切换到XSLT 2.0处理器,则需要(a)确保处理器是模式感知的,并且时间被验证为xs:duration,或者(b)通过调用
xs:duration(Time)
显式地将其转换为类型
xs:duration


当然,您需要确保它是@MadsHansen所指出的有效持续时间,
$duration

设置在哪里?感谢您的输入……我刚刚运行了以下代码,并在日志中给出了不同的错误消息(注意:我在请求XML PT01H30M33S中添加了T):-请你检查一下我的代码,告诉我哪里出错了要切换到XSLT2.0处理器,我需要做什么。我已经在我的评论部分添加了上面最新的xsl。请看一看。谢谢…对不起,我想我解释过了。Xalan是XSLT1.0处理器。它不理解XSLT2.0。要从Java运行XSLT 2.0,请改用Saxon。@StackOverflow惯例不是写注释说“谢谢”,而是通过单击答案旁边的勾选/复选标记将答案标记为已接受。