-5

入力ファイル:

<root>
    <sector>
        <nodeA id="a">
            <section id="i">
                <item1 id="1" method="create"> 
                    <somechild>a</somechild>
                </item1>

                <item1 id="1" method="delete" />
            </section>                   
        </nodeA>

        <nodeA id="b">
            <cell id="ii">  
                <item2 id="2" method="create"> 
                    <otherchild>a</otherchild>
                </item2>
            </cell>
            <cell id="ii">
                <item2 id="2" method="delete" />
            </cell>                   
        </nodeA>

        <nodeB id="i">
            <cell id="ii">  
                <item3 id="1" method="create"> 
                    <child>b</child>
                </item3>
            </cell>

            <cell id="ii">
                <item3 id="1" method="delete" />
                <item3 id="1" method="create"> 
                    <otherchild>a</otherchild>
                </item3>
            </cell>                   
        </nodeB>
    </sector> 
</root>

期待される出力:

<root>
    <sector>
        <nodeA id="a">
            <section id="i">
            </section>                   
        </nodeA>

        <nodeA id="b">
            <cell id="ii">  
            </cell>
            <cell id="ii">
            </cell>                   
        </nodeA>

        <nodeB id="i">
            <cell id="ii">  
                <item3 id="1" method="create"> <!-- this is not eliminated as it violates the rule by having create followed by delete and followed by create again -->
                    <child>b</child>
                </item3>
            </cell>

            <cell id="ii">
                <item3 id="1" method="delete" />
                <item3 id="1" method="create"> 
                    <otherchild>a</otherchild>
                </item3>
            </cell>                   
        </nodeB>
    </sector> 
</root>

このルールを使用して、xml のノードを削除する必要があります。

  • の 1 つのノードにmethod="create"続いて の 1 つのノードmethod="delete"が削除されます
  • シナリオは、要素名と ID が同じである限り、1 つの親で発生するか、2 つの親で広がる可能性があります。<cell id="ii">

XSLT 1.0 または 2.0 を使用してこの変換を行うにはどうすればよいですか?

ありがとうございました。

4

1 に答える 1

1

ここに 1 つのアプローチがあります。削除しようとしているアイテムをグループ化するためのキーを定義します。要素の @id 属性と、2 つの親ノードの @id 属性でグループ化していると思います

<xsl:key 
   name="items" 
   match="*[@method != '']" use="concat(@id, '|', ../@id, '|', ../../@id)" />

次に、キーに 2 つの要素があり、もう 1 つのアイテムが@method='delete'である@method='create'アイテムに一致するテンプレートを作成できます。

<xsl:template match="*
   [@method = 'create']
   [count(key('items', concat(@id, '|', ../@id, '|', ../../@id))) = 2]
   [key('items', concat(@id, '|', ../@id, '|', ../../@id))[@method = 'delete']]" />

同様の方法で、他の@method='delete'と一致するテンプレートも必要です。

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="items" match="*[@method != '']" use="concat(@id, '|', ../@id, '|', ../../@id)" />

   <xsl:template match="*[@method = 'create'][count(key('items', concat(@id, '|', ../@id, '|', ../../@id))) = 2][key('items', concat(@id, '|', ../@id, '|', ../../@id))[@method = 'delete']]" />
   <xsl:template match="*[@method = 'delete'][count(key('items', concat(@id, '|', ../@id, '|', ../../@id))) = 2][key('items', concat(@id, '|', ../@id, '|', ../../@id))[@method = 'create']]" />

   <xsl:template match="@*|node()" name="identity">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

サンプル XML に適用すると、次のように出力されます。

<root>
   <sector>
      <nodeA id="a">
         <section id="i"/>
      </nodeA>
      <nodeA id="b">
         <cell id="ii"/>
         <cell id="ii"/>
      </nodeA>
      <nodeB id="i">
         <cell id="ii">
            <item3 id="1" method="create">
               <child>b</child>
            </item3>
         </cell>
         <cell id="ii">
            <item3 id="1" method="delete"/>
            <item3 id="1" method="create">
               <otherchild>a</otherchild>
            </item3>
         </cell>
      </nodeB>
   </sector>
</root>
于 2012-05-24T22:15:39.383 に答える