XSLT 2.0出现错误:“上下文项目未定义”

6
我们使用Altova Stylevision生成XSLT 2.0文件。我们使用Java的Saxon 9来执行这些XSLT文件。这已经运行良好了几年,但遗憾的是我们中没有人真正理解XSLT。
现在我们遇到了错误:
Error at /xsl:stylesheet/xsl:function[9]
XPDY0002: Axis step child::element(item, xs:anyType) cannot be used here:
  the context item is undefined

第九个功能是:
<xsl:function name="sps:GoogleChartDataSourceUnitCount" as="xs:string">
  <xsl:sequence select="concat(string-join(item/string(if ( number($XML/report/calculation-data[@data-source-name = $DataSourceParent]/item/variable[@name=&apos;unit_count&apos;]/@value) &lt; 0 ) then 0 else round-half-to-even(number(variable[@name=&apos;unit_count&apos;]/@value),2)),&apos;,&apos;),&apos;&amp;chxl=0:|&apos;,string-join(item/variable[@name=&apos;month&apos;]/@value,&apos;|&apos;),&apos;|2:||Min&amp;chds=0,&apos;,string(round-half-to-even( max(item/(number(variable[@name=&apos;unit_count&apos;]/@value)))+1 , 0 )),&apos;&amp;chxr=1,0,&apos;,string(round-half-to-even( max(item/(number(variable[@name=&apos;unit_count&apos;]/@value)))+1 , 0 )))"/>
</xsl:function>

有人知道发生了什么事吗?

3个回答

10
问题在于该函数使用像item这样的路径表达式,需要作为规范规定的一个上下文项。"在样式表函数的主体内,焦点最初未定义;这意味着任何尝试引用上下文项、上下文位置或上下文大小的操作都会导致不可恢复的动态错误[XPDY0002]。因此,该函数需要具有一个参数,将节点或节点序列传递到应该应用路径的位置。例如:

<xsl:function name="sps:GoogleChartDataSourceUnitCount" as="xs:string">
  <xsl:param name="nodes"/>
  <xsl:sequence select="concat(string-join($nodes/item/string(...)))"/>
</xsl:function>
并且需要使用例如 sps:GoogleChartDataSourceUnitCount(.) 进行调用。

如果样式表是由Altova的某些工具生成的,您可能希望在Altova论坛上查询是否存在已知问题,并且是否有可用的解决方法。


7
根据W3C XSLT 2.0 规范,对于xsl:function,初始上下文项目为未定义状态。

这意味着在函数体内,对数据(项)的任何引用都只能通过参数(传递或全局)或变量进行。

问题在于所提供的代码中的一个表达式以以下内容开头:

concat(string-join(item ...

这明显违反了上述规则——item是在上下文项之外引用的,而在xsl:function中不允许。

解决方案:

  1. 将预期的上下文项作为参数传递(推荐),例如命名为pDoc,或者使用全局变量/参数包含预期的上下文项。

  2. 在XPath表达式的第一个位置步骤中引用该参数/变量中的项目,例如$pDoc/item

FAQ: 为什么要有这个限制?

答案: 不允许隐式初始上下文项使XSLT处理器能够执行更广泛的静态分析,并且可以更积极地优化代码。


3
您可能会在不同的使用情况下遇到此问题。对于我来说,由于我在函数内忘记在参数前加上美元符号($),因此处理器认为我正在使用未指定上下文的节点标签,然后出现了这个错误。我只需要在我的参数前面加上 $ 符号即可。希望我的解决方案对其他人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接