我们使用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='unit_count']/@value) < 0 ) then 0 else round-half-to-even(number(variable[@name='unit_count']/@value),2)),','),'&chxl=0:|',string-join(item/variable[@name='month']/@value,'|'),'|2:||Min&chds=0,',string(round-half-to-even( max(item/(number(variable[@name='unit_count']/@value)))+1 , 0 )),'&chxr=1,0,',string(round-half-to-even( max(item/(number(variable[@name='unit_count']/@value)))+1 , 0 )))"/>
</xsl:function>
有谁知道发生了什么事?
答案 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 specification,xsl:function
的初始上下文项未定义。
这意味着在函数体内部,任何对数据(项)的引用都只能在参数(传递或全局)或变量之外发生。
问题是所提供代码中的表达式以:
开头concat(string-join(item ...
这显然违反了上述规则 - item
是从上下文项引用的,xsl:function
中不允许这样做。
解决方案:
将预期的上下文项作为参数(推荐)传递给名为pDoc
,或者让全局变量/参数包含预期的上下文项。
在该参数/变量的XPath表达式的第一个位置步骤中引用项目,例如$pDoc/item
常见问题:为什么会出现此限制?
答案:不允许隐式初始上下文项使XSLT处理器能够执行更广泛的静态分析并更加积极地优化代码。
答案 2 :(得分:3)
您可能会遇到来自不同用例的此问题。 对我来说,因为我忘了在我的函数中的param之前放入$($)符号, 所以处理器认为我使用的是node-tag而没有指明上下文,然后给出了这个错误。 我只需要在我的参数之前加上$。 希望我的解决方案对其他人有所帮助。