少なくとも 1 つのポインターを含むa
属性を持つ要素を含む XML があり、空白で区切られた任意の数のポインターを含むことができます: . XSLT 1.0 スタイルシートでは、ドキュメント内で参照されているすべての要素のみにテンプレートを適用する必要があります。@ref
<a ref="#p1 #p2"/>
b
a/@ref
そこで、 の値を構成要素に<xsl:key name="k1" match="a" use="my:refs(@ref)"/>
分割する関数を使用して を定義し、 を持たせるという考えになると思いました。仕様を正しく解釈すると:@ref
<xsl:template match="b[key('k1', @xml:id)]"/>
use 属性は、キーの値を指定する式です。式は、パターンに一致するノードごとに 1 回評価されます。結果がノード セットの場合、ノード セット内の各ノードについて、パターンに一致するノードは指定された名前のキーを持ち、その値はノード セット内のノードの文字列値です。
(先頭の「#」を引いた)の値からなる を文字列として@use
返す関数を提供する必要があります。node-set
a/@ref
<xsl:key name="k1" match="a" use="str:tokenize(@ref, '# ')/>
私の解決策は、とを定義することでした<xsl:template match="a[key('k1', @xml:id)">
。
Xalan をプロセッサとして使用すると、これで目的の結果が得られます。ただし、Saxon 9.6.0.7 では、循環キー定義について不満があります。
今、私は少し混乱しています:私の解決策はまったく有効ですか?もしそうなら、なぜサクソン人は不平を言っているのですか?他の/より良い(/本当の)解決策はありますか? [コメントを参照]。
編集:追加の質問: XSLT 2.0 で結果を取得するにはどうすればよいですか? キー定義で使用tokenize(@ref, '#')
するだけでは、空白があるため十分ではありませんが、normalize-space(tokenize(@ref, '#'))
Saxon では同じエラー XTDE0640 が発生します。
ありがとう、ダリオ
XML の例:
<root>
<b xml:id="#p1">P1</b>
<b xml:id="#p2">P2</b>
<b xml:id="#pn">Pn</b>
<a ref="#p2" />
<a ref="#p1 #pn" />
</root>
出力は
P1
P2
Pn
(特に注文する必要はありません)。