1

私の要件は、Relation のwhereまたはor onlyのいずれか@guidと一致する Relation タグを削除することです。上記のロジックは、関係のwhereまたはor onlyのいずれかと一致する必要がある場合にも適用できます。@relationObj<roleCode tc=32><roleCode tc=31><roleCode tc=8>@relationObj@relationObj<roleCode tc=32><roleCode tc=31><roleCode tc=8>

基本的に、またはまたはに属する他の関係タグを検索@guidして検索したい。この条件が true の場合、このセクションを削除します。@relationObj@relationObj<roleCode tc=32><roleCode tc=31><roleCode tc=8>

以下は XML です。

<Relations>
<Relation guid="abcd1234" relationObj="1234">
    <roleCode tc="20"/>
</Relation>
<Relation guid="xyz123" relationObj="1111">
    <roleCode tc="32"/>
</Relation>

<Relation guid="def123" relationObj="2222">
    <roleCode tc="31"/>
</Relation>

<Relation guid="1111" relationObj="2222">
    <roleCode tc="98"/>
</Relation>

<Relation guid="jkl123" relationObj="3333">
    <roleCode tc="8"/>
</Relation>

<Relation guid="2222" relationObj="1234">
    <roleCode tc="100"/>
</Relation>
</Relations>

テンプレート内@relationObjでそれぞれ抽出する変数を 3 つ作成してみました。<roleCode tc>[32,31 and 8]そして、これら 3 つの変数と比較@objectIdします。しかし、ここでの問題は、反復中に別のタグ@relationObjに遭遇すると、変数が空の値に更新されることです。<Relation>

上記のxmlから、変換後にxmlの下に取得する必要があります。

<Relations>
<Relation guid="abcd1234" relationObj="1234">
    <roleCode tc="20"/>
</Relation>
<Relation guid="xyz123" relationObj="1111">
    <roleCode tc="32"/>
</Relation>

<Relation guid="def123" relationObj="2222">
    <roleCode tc="31"/>
</Relation>
<Relation guid="jkl123" relationObj="3333">
    <roleCode tc="8"/>
</Relation>
<Relation guid="2222" relationObj="1234">
    <roleCode tc="100"/>
</Relation>
</Relations>

観察すると、<Relation>[guid="1111" relationshipObj="2222"] のタグが削除されています。@guid と @relationObj の両方が roleCodes - 32、31、または 8 のいずれかに属しているためです。

新しい変数で更新せずに変数に値を保存するのに最適なものを教えてください。または、これを達成できるより良いアプローチがありますか。御時間ありがとうございます。

4

1 に答える 1

1

特定の のすべての値を抽出できるキーを定義し、そのキーを使用して除外する要素を選択することで、これにアプローチします。あなたの要件を正しく理解していれば、これでうまくいくはずです:roleCoderelationObjRelation

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:key name="roleCodeByRelObj" match="roleCode" use="../@relationObj" />

  <!-- copy input to output except where more specific template applies -->
  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

  <!-- ignore any Relation whose guid and relationObj match the relationObj of a
       Relation whose roleCode/@tc is 8, 31 or 32 (not necessarily the same
       matching Relation in both cases) -->
  <xsl:template match="Relation[
       (
         (key('roleCodeByRelObj', @guid)/@tc = '8') or
         (key('roleCodeByRelObj', @guid)/@tc = '31') or
         (key('roleCodeByRelObj', @guid)/@tc = '32')
       )
     and
       (
         (key('roleCodeByRelObj', @relationObj)/@tc = '8') or
         (key('roleCodeByRelObj', @relationObj)/@tc = '31') or
         (key('roleCodeByRelObj', @relationObj)/@tc = '32')
       )
    ]" />

</xsl:stylesheet>

一方がノード セットである場合に XPath で等価性テストが機能する方法は、セット内のいずれかのノードが値と一致する場合にテストが true になるというものです。したがって、

key('roleCodeByRelObj', @guid)/@tc = '31'

guid"2222" の場合roleCode、キー関数 (tc=31およびtc=98) から 2 つの要素が返され、そのうちの 1 つがターゲット値と一致するため、全体的なテストは成功します。

于 2013-07-22T09:53:18.733 に答える