0

少なくとも 1 つのポインターを含むa属性を持つ要素を含む XML があり、空白で区切られた任意の数のポインターを含むことができます: . XSLT 1.0 スタイルシートでは、ドキュメント内で参照されているすべての要素のみにテンプレートを適用する必要があります。@ref<a ref="#p1 #p2"/>ba/@ref

そこで、 の値を構成要素に<xsl:key name="k1" match="a" use="my:refs(@ref)"/>分割する関数を使用して を定義し、 を持たせるという考えになると思いました。仕様を正しく解釈すると:@ref<xsl:template match="b[key('k1', @xml:id)]"/>

use 属性は、キーの値を指定する式です。式は、パターンに一致するノードごとに 1 回評価されます。結果がノード セットの場合、ノード セット内の各ノードについて、パターンに一致するノードは指定された名前のキーを持ち、その値はノード セット内のノードの文字列値です。

(先頭の「#」を引いた)の値からなる を文字列として@use返す関数を提供する必要があります。node-seta/@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

(特に注文する必要はありません)。

4

0 に答える 0