0

私はこの入力ファイルを持っています:

<myroot>
    <list id="xxx">
        <node id="a">
            <section id="i">
                <item1 id="a0" method="start">
                    <somechild>a</somechild>
                </item1>
                <item1 id="a0" method="start"> <!-- this one is successive from the previous so we eliminate -->
                    <somechild>a</somechild>
                </item1>
                <item1 id="a0" method="stop"/>                
                <item1 id="a0" method="start">
                    <somechild>a</somechild>
                </item1>
            </section>  

            <section id="i">
                <item1 id="a0" method="start"> <!-- this one is successive from the previous so we eliminate -->
                    <somechild>a</somechild>
                </item1>
                <item1 id="a0" method="stop"/>  
                 <item1 id="a0" method="start">
                    <somechild>a</somechild>
                </item1>
                 <item1 id="a0" method="start"> <!-- this one is successive from the previous so we eliminate -->
                    <somechild>a</somechild>
                </item1>
            </section>                
        </node>
    </list>
</myroot>

そして私の出力:

 <myroot>
        <list id="xxx">
            <node id="a">
                <section id="i">
                    <item1 id="a0" method="start">
                        <somechild>a</somechild>
                    </item1>
                    <item1 id="a0" method="stop"/>                
                </section>  

                <section id="i" />
            </node>
        </list>
    </myroot>

**While the expected output should be:**

<myroot>
    <list id="xxx">
        <node id="a">
            <section id="i">
                <item1 id="a0" method="start">
                    <somechild>a</somechild>
                </item1>
                <item1 id="a0" method="stop"/>                
                <item1 id="a0" method="start">
                    <somechild>a</somechild>
                </item1>
            </section>  

            <section id="i">
                <item1 id="a0" method="stop"/>  
                 <item1 id="a0" method="start">
                    <somechild>a</somechild>
                </item1>
            </section>                
        </node>
    </list>
</myroot>

XSLT ファイル:

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

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

    <xsl:template match="/*/*/*">
        <xsl:copy>
            <xsl:variable name="first-in-group" as="element()*">
                <xsl:for-each-group select="*" group-by="concat(node-name(.), '|', @id,'|', @method)">
                    <xsl:for-each-group select="current-group()/*" group-by="concat(@id, '|', @method)">
                        <xsl:sequence 
              select="for $pos in 1 to count(current-group())
                      return current-group()[$pos]
                              [every $item 
                              in subsequence(current-group(), 1, $pos - 1) 
                              satisfies not(deep-equal($item, current-group()[$pos]))] "/>
                    </xsl:for-each-group>
                </xsl:for-each-group>
            </xsl:variable>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates>
                <xsl:with-param name="first-in-group" select="$first-in-group" tunnel="yes"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*/*/*/*/*">
        <xsl:param name="first-in-group" tunnel="yes"/>
        <xsl:if test="$first-in-group intersect .">
            <xsl:call-template name="identity"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

別のシナリオ:

<myroot>
    <list id="xxx">
        <node id="a">
            <section id="i">
                <item1 id="a0" method="start">
                    <somechild>a</somechild>
                </item1>
            </section>  

            <section id="i">               
                <item1 id="a1" method="start"> 
                    <somechild>a</somechild>
                </item1>
                <item1 id="a0" method="start"> <!-- this one is successive from the previous, because the previous node has id of 'a1', so we eliminate -->
                    <somechild>a</somechild>
                </item1>
                <item1 id="a0" method="start"> <!-- this one is successive from the previous so we eliminate -->
                    <somechild>a</somechild>
                </item1>
            </section>                
        </node>
    </list>
</myroot>

期待される出力:

<myroot>
    <list id="xxx">
        <node id="a">
            <section id="i">
                <item1 id="a0" method="start">
                    <somechild>a</somechild>
                </item1>
            </section>  

            <section id="i">               
                <item1 id="a1" method="start">
                    <somechild>a</somechild>
                </item1>
            </section>                
        </node>
    </list>
</myroot>

アイデアは、同じ方法で連続するノードを削除することです。例では:

  • 開始/開始/停止/開始/開始 --> 開始/停止/開始

XSLT は連続するノードを削除できますが、上記のシナリオでは機能しません。

上記のシナリオに対応するために xslt を変更する必要がある場所を教えてもらえますか? 助けてくれて本当にありがとう。

乾杯、ジョン

4

1 に答える 1

1

多分私は何かが欠けているかもしれませんが、あなたはそれを複雑にしすぎているようです. 同じ名前の最初の前の要素と等しい要素を一致/削除できる必要があります。

XSLT 2.0

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

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

    <xsl:template match="*[*][deep-equal(.,preceding::*[name()=current()/name()][1])]"/>

</xsl:stylesheet>

XML 出力(上記の更新済み xml を使用)

<myroot>
   <list id="xxx">
      <node id="a">
         <section id="i">
            <item1 id="a0" method="start">
               <somechild>a</somechild>
            </item1>
            <item1 id="a0" method="stop"/>
            <item1 id="a0" method="start">
               <somechild>a</somechild>
            </item1>
         </section>
         <section id="i">
            <item1 id="a0" method="stop"/>
            <item1 id="a0" method="start">
               <somechild>a</somechild>
            </item1>
         </section>
      </node>
   </list>
</myroot>
于 2012-06-03T04:07:00.733 に答える