1

これは入力ファイルです:

<root> 
    <node id="N1">
        <fruit id="1" action="aaa">
            <orange id="x" action="create">
                <attribute>
                    <color>Orange</color>
                    <year>2012</year>
                </attribute>
            </orange>
            <orange id="x" action="change">
                <attribute>
                    <color>Red</color>
                </attribute>
            </orange>
            <orange id="x" action="change">
                <attribute>
                    <color>Blue</color>
                    <condition>good</condition>
                </attribute>
            </orange>
        </fruit>

    </node>

    <node id="N2">
        <car id="1">    
            <bmw id="i" action="change">
                <attribute>
                    <color>Blue</color>    
                </attribute>
            </bmw>      
            <bmw id="i" action="change">
                <attribute>
                    <color>Yellow</color>    
                </attribute>
            </bmw>
            <bmw id="i" action="change">
                <attribute>
                    <color>Pink</color>    
                </attribute>
            </bmw>


        <bmw id="j" action="delete">
            <attribute>
                <color>Blue</color>    
            </attribute>
        </bmw>
        <bmw id="j" action="delete">
            <attribute>
                <color>Yellow</color>    
            </attribute>
        </bmw>

    </car>
    </node>
</root>

これは期待される出力です:

<root> 
    <node id="N1">
        <fruit id="1" action="aaa">
            <orange id="x" action="create">
                <attribute>
                    <color>Blue</color>
                    <year>2012</year>
                    <condition>good</condition>
                </attribute>
            </orange>                      
        </fruit>       
    </node>

    <node id="N2">
        <car id="1">    

            <bmw id="i" action="change">
                <attribute>
                    <color>Pink</color>    
                </attribute>
            </bmw>


        <bmw id="j" action="delete">
            <attribute>
                <color>Yellow</color>    
            </attribute>
        </bmw>
      </car>
    </node>
</root>

ルール:

  1. 「create」メソッドの後に 1 つ以上の「change」メソッドが続くノードがある場合、それらをマージし、最後の「change」のすべての子を「create」メソッドのノードに使用します。(注: 良いものを追加)

  2. 1 つ以上の「変更」メソッドがある場合は、それらをマージして、最後の「変更」メソッドの子のみを使用します。

  3. 1 つ以上の「delete」メソッドがある場合は、それらをマージして、最後の「delete」メソッドの子のみを使用します。

マージするノードの ID は同じでなければならないことに注意してください。

この問題の XSLT ソリューションについて教えてください。本当にありがとう。

敬具、ジョン

4

1 に答える 1

2

この変換:

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

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

     <xsl:template match="node/*/*[1]">
      <xsl:copy>
       <xsl:apply-templates select="@* | ../*[last()]/*"/>
      </xsl:copy>
     </xsl:template>

     <xsl:template match=
      "node/*/*
        [@action='delete'
       and
         following-sibling::*[1][@action='delete']
        ]"/>

     <xsl:template match=
      "node/*/*
        [@action='change'
       and
         following-sibling::*[1][@action='change']
       or
         preceding-sibling::*[@action='create']
        ]"/>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<root>
    <node id="N1">
        <fruit id="1" action="aaa">
            <orange id="x" action="create">
                <attribute>
                    <color>Orange</color>
                </attribute>
            </orange>
            <orange id="x" action="change">
                <attribute>
                    <color>Red</color>
                </attribute>
            </orange>
            <orange id="x" action="change">
                <attribute>
                    <color>Blue</color>
                    <condition>good</condition>
                </attribute>
            </orange>
        </fruit>
    </node>
    <node id="N2">
        <car id="1">
            <bmw id="i" action="change">
                <attribute>
                    <color>Blue</color>
                </attribute>
            </bmw>
            <bmw id="i" action="change">
                <attribute>
                    <color>Yellow</color>
                </attribute>
            </bmw>
            <bmw id="i" action="change">
                <attribute>
                    <color>Pink</color>
                </attribute>
            </bmw>
            <bmw id="j" action="delete">
                <attribute>
                    <color>Blue</color>
                </attribute>
            </bmw>
            <bmw id="j" action="delete">
                <attribute>
                    <color>Yellow</color>
                </attribute>
            </bmw>
        </car>
    </node>
</root>

必要な正しい結果が生成されます。

<root>
   <node id="N1">
      <fruit id="1" action="aaa">
         <orange id="x" action="create">
            <attribute>
               <color>Blue</color>
               <condition>good</condition>
            </attribute>
         </orange>
      </fruit>
   </node>
   <node id="N2">
      <car id="1">
         <bmw id="i" action="change">
            <attribute>
               <color>Pink</color>
            </attribute>
         </bmw>
         <bmw id="j" action="delete">
            <attribute>
               <color>Yellow</color>
            </attribute>
         </bmw>
      </car>
   </node>
</root>
于 2012-04-29T03:03:19.013 に答える