そのため、一方の XPath 式が必要なノードを取得し、もう一方の XPath 式が取得しない理由を理解するのに苦労しています。
まず、xml:
<doc>
<source id="225" clientID="567" matterID="225" level="2" />
<source id="226" clientID="993" matterID="226" level="2" />
<dest id="185" level="7" />
<dest id="226" level="7" />
</doc>
私の xsl テンプレートのキーは次のように定義されています。
<xsl:key name="sourceId" match="//source" use="@id" />
<xsl:key name="destId" match="//dest" use="@id" />
<xsl:key name="destLevel" match="//dest" use="@level" />
私が探しているのは、id で dest ノードに一致するが、異なるレベル属性を持つソース ノードです。頭の中で機能すると考えた適用テンプレートは次のとおりです。
<xsl:apply-templates select="source[key('destId', @id) and not(key('destLevel', @level))]" mode="update" />
しかし、それはうまくいかないようです。同僚は、私が望まないノードに一致する式の周りに not を置くことを提案しました。多くの試行錯誤の後、私はこれがうまくいくかもしれないと考えましたが、効果はありませんでした:
<xsl:apply-templates select="source[not(not(key('destId', @id)) or not(key('destLevel', @level)))]" mode="update" />
これを解決するために必要なことを教えてください。
編集:以前は2番目のクエリでこれを解決したと思っていましたが、間違っていたようです。
====解決策====
Dimitre Novatchev は、これを解決するためのさまざまな方法を詳細に説明していますが、私の最終的な解決策は、実際には彼のものとは少し異なっていました。
要するに、2 つの属性を組み合わせた concat() 関数を使用して仮想キーを作成しました。そうすれば、ID に一致するノードを見つけることができましたが、ID レベルのコンボには一致しませんでした。
追加のキー:
<xsl:key name="destByIdAndLevel" match="//dest" use="concat(@id,'+',@level)" />
apply-template 呼び出しの変更:
<xsl:apply-templates select="source[key('destId', @id) and not(key('destByIdAndLevel',concat(@id,'+',@level)))]" mode="update" />