XSLT 2.0产生错误:“上下文项未定义”

时间:2012-04-10 09:07:22

标签: xslt xslt-2.0 saxon altova

我们使用Altova Stylevision生成XSLT 2.0文件。我们使用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>

有谁知道发生了什么事?

3 个答案:

答案 0 :(得分:10)

问题是该函数使用路径表达式,如item需要上下文项the specification mandates“在样式表函数的主体内,焦点最初是未定义的;这意味着任何尝试引用上下文项,上下文位置或上下文大小是不可恢复的动态错误。[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 forums中查询这是否是已知问题以及是否有可用的修复。

答案 1 :(得分:7)

根据W3C XSLT 2.0 specificationxsl:function的初始上下文项未定义

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

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

开头
concat(string-join(item ...

这显然违反了上述规则 - item是从上下文项引用的,xsl:function中不允许这样做。

解决方案

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

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

  3. 常见问题:为什么会出现此限制?

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

答案 2 :(得分:3)

您可能会遇到来自不同用例的此问题。 对我来说,因为我忘了在我的函数中的param之前放入$($)符号, 所以处理器认为我使用的是node-tag而没有指明上下文,然后给出了这个错误。 我只需要在我的参数之前加上$。 希望我的解决方案对其他人有所帮助。