6

XSLT 2.0 ファイルを生成する Altova Stylevision を使用しています。これらの XSLT ファイルを実行するには、Saxon 9 for Java を使用します。これは数年間うまく機能してきましたが、悲しいかな、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コンテキストアイテムを必要とするようなパス式を使用することです。サイズは回復不能な動的エラーです。[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フォーラムで問い合わせることができます。

于 2012-04-10T09:56:32.713 に答える
7

W3C XSLT 2.0 仕様によると、an の初期コンテキスト項目xsl:functionは未定義です。

つまり、関数本体内では、データ (アイテム) への参照は、パラメーター (渡されたまたはグローバル) または変数からのみ発生する可能性があります。

問題は、提供されたコードの式が で始まることです:

concat(string-join(item ...

これは明らかに上記の規則に違反しています --itemはコンテキスト項目から参照されていますが、これは の内部では許可されていませんxsl:function

解決策

  1. 目的のコンテキスト アイテムをパラメーターとして渡す (推奨) named と言うpDocか、グローバル変数/パラメーターに目的のコンテキスト アイテムを含めます。

  2. そのパラメーター/変数から離れた XPath 式の最初の場所のステップで項目を参照します。たとえば、$pDoc/item

FAQ : この制限はなぜですか?

回答: 暗黙の初期コンテキスト項目を許可しないことで、XSLT プロセッサがより広範な静的分析を実行し、コードをより積極的に最適化できるようになります。

于 2012-04-10T12:00:28.207 に答える
3

さまざまなユースケースでこの問題が発生する可能性があります。私の場合、関数内のパラメータの前にドル($)記号を付けるのを忘れたため、プロセッサはコンテキストを示さずにノードタグを使用していると見なし、このエラーを出します。パラメータの前に$を付ける必要があります。私の解決策が他の人に役立つことを願っています。

于 2013-01-15T20:09:52.583 に答える