2

質問はこれに似ています 、以前の質問 ディミトレがすでに回答しています。応答 xml に若干の変更があります。ただし、今回は、繰り返しブロックから 1 つの要素を取得する必要があります。ここで xsl key 関数を使用できるかどうかはわかりません。

私の入力xml

<M>
   <a>
      <b>
         <c f="123">
            <key>Al</key>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
   <a>
      <b>
         <c f="123">
            <key>Al</key>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
   <a>
      <b>
         <c f="567">
            <key>Al</key>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
   <a>
      <b>
         <somethingelse/>
      </b>
   </a>
</M>

目的の出力 xml - 重複を削除するだけでなく、繰り返しブロックからキー要素を取得する必要があることに注意してください。それは同じかもしれないし、そうでないかもしれません。

<M>
   <a>
      <b>
         <c f="123">
            <key>Al</key>
            <key>Al</key>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
   <a>
      <b>
         <c f="567">
            <key>Al</key>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
   <a>
      <b>
         <somethingelse/>
      </b>
   </a>
</M>
4

1 に答える 1

1

この変換:

<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:key name="kAByC-F" match="a" use="*/c/@f"/>

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

         <xsl:template match=
          "a[*/c
           and
             not(generate-id()
                =
                 generate-id(key('kAByC-F', */c/@f)[1])
                 )
            ]"/>

         <xsl:template match="a/b/c[@f]">
          <c f="{@f}">
            <xsl:apply-templates select="key('kAByC-F', @f)/b/c/key"/>
            <xsl:apply-templates select="*[not(self::key)]"/>
          </c>
         </xsl:template>
</xsl:stylesheet>

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

<M>
    <a>
        <b>
            <c f="123">
                <key>Al</key>
                <e NO="678">
                    <f>Y</f>
                    <g>
                        <h>FTO</h>
                    </g>
                </e>
            </c>
        </b>
    </a>
    <a>
        <b>
            <c f="123">
                <key>Al</key>
                <e NO="678">
                    <f>Y</f>
                    <g>
                        <h>FTO</h>
                    </g>
                </e>
            </c>
        </b>
    </a>
    <a>
        <b>
            <c f="567">
                <key>Al</key>
                <e NO="678">
                    <f>Y</f>
                    <g>
                        <h>FTO</h>
                    </g>
                </e>
            </c>
        </b>
    </a>
    <a>
        <b>
            <somethingelse/>
        </b>
    </a>
</M>

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

<M>
   <a>
      <b>
         <c f="123">
            <key>Al</key>
            <key>Al</key>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
   <a>
      <b>
         <c f="567">
            <key>Al</key>
            <e NO="678">
               <f>Y</f>
               <g>
                  <h>FTO</h>
               </g>
            </e>
         </c>
      </b>
   </a>
   <a>
      <b>
         <somethingelse/>
      </b>
   </a>
</M>

説明:

  1. アイデンティティ ルールは、すべてのノードを「そのまま」コピーします。これは、特定のノードに一致する 2 つのテンプレートによってオーバーライドされます。

  2. 最初のオーバーライド テンプレートは、キーを使用して指定されaた最初の要素ではないすべての要素を削除aします ( Muenchian グループ化メソッド)。

  3. 2 番目のオーバーライド テンプレートは、(最初のオーバーライド テンプレートによって) 削除されていない要素のc孫を照合して処理します。a

于 2012-06-15T04:42:45.793 に答える