2012-04-10 23 views
6

我們使用Altova Stylevision生成XSLT 2.0文件。我們使用Saxon 9 for Java來執行這些XSLT文件。這幾年來運行良好,唉,我們都沒有真正理解XSLT。XSLT 2.0產生錯誤:「上下文項未定義」

現在我們有錯誤:

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> 

沒有人有任何想法是怎麼回事? 「

回答

8

問題是函數使用的路徑表達式如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中查詢這是否是已知問題以及是否有修補程序可用。

7

根據W3C XSLT 2.0 specificationxsl:function的初始上下文項未定義

這意味着在函數體內,對數據(項)的任何引用都只能發生在參數(傳遞或全局)或變量之外。

的問題是,在提供的代碼中的表達式與開始:

concat(string-join(item ... 

並且這明顯違反上述規則 - item被引用過一個上下文項,這是不內允許一個xsl:function

解決方案

  1. 傳意上下文項作爲參數(推薦)說命名pDoc,或有一個全局變量/參數包含預期的上下文項。在XPath表達式關閉該參數/變量的第一定位步驟

  2. 參考項目,例如$pDoc/item

FAQ:這是爲什麼限制?

答案:不允許隱含的初始上下文項目使得XSLT處理器可以執行更廣泛的靜態分析並且更積極地優化代碼。

3

您可能會遇到來自不同用例的此問題。 對我來說,因爲我忘了在函數內部的參數之前放置美元($)符號,所以處理器認爲我使用了一個沒有指明上下文的節點標記,然後給出了這個錯誤。 我只需要把$放在我的參數之前。 希望我的解決方案對其他人有所幫助。