6

我们使用生成 XSLT 2.0 文件的 Altova Stylevision。我们使用 Saxon 9 for Java 来执行这些 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

第9个功能是:

<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>

有谁知道发生了什么?

4

3 回答 3

10

问题是该函数使用路径表达式item,例如需要上下文项,因为规范要求“在样式表函数的主体中,焦点最初是未定义的;这意味着任何引用上下文项、上下文位置或上下文的尝试size 是不可恢复的动态错误。[XPDY0002]"。因此,该函数需要有一个参数,该参数传入应该应用路径的节点或节点序列,例如

<xsl:function name="sps:GoogleChartDataSourceUnitCount" as="xs:string">
  <xsl:param name="nodes"/>
  <xsl:sequence select="concat(string-join($nodes/item/string(...)))"/>
</xsl:function>

然后需要用 eg 调用sps:GoogleChartDataSourceUnitCount(.)

如果样式表是由 Altova 的某个工具生成的,您可能想在Altova 论坛中询问这是否是一个已知问题以及是否有可用的修复程序。

于 2012-04-10T09:56:32.713 回答
7

根据W3C XSLT 2.0 规范,an 的初始上下文项xsl:function是未定义的。

这意味着在函数体内对数据(项目)的任何引用只能发生在参数(传递的或全局的)或变量之外。

问题是提供的代码中的表达式以

concat(string-join(item ...

这显然违反了上述规则——item从上下文项目中引用,这是不允许在xsl:function.

解决方案

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

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

常见问题解答:为什么会有这个限制?

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

于 2012-04-10T12:00:28.207 回答
3

您可能会在不同的用例中遇到此问题。对我来说,由于我忘记在函数内的参数之前放置美元 ($) 符号,所以处理器认为我正在使用节点标签而不指示上下文,然后给出此错误。我只需要将 $ 放在我的参数之前。希望我的解决方案对其他人有所帮助。

于 2013-01-15T20:09:52.583 回答