2017-01-24 7 views
0

私はfor-each-groupループを試みましたが、私のためのトリックはしません。基本的に私は、次のXMLがあります子ノード依存のXMLグループ化

<Root> 
    <Row> 
     <CODE>A001</CODE> 
     <LANG>EN</LANG> 
     <DESCR>Car</DESCR> 
    </Row> 
    <Row> 
     <CODE>A001</CODE> 
     <LANG>FR</LANG> 
     <DESCR>Voiture</DESCR> 
    </Row> 
    <Row> 
     <CODE>A001</CODE> 
     <LANG>NL</LANG> 
     <DESCR>Auto</DESCR> 
    </Row> 
    <Row> 
     <CODE>A002</CODE> 
     <LANG>EN</LANG> 
     <DESCR>Bicycle</DESCR> 
    </Row> 
    <Row> 
     <CODE>A002</CODE> 
     <LANG>FR</LANG> 
     <DESCR>Velo</DESCR> 
    </Row> 
    <Row> 
     <CODE>A002</CODE> 
     <LANG>NL</LANG> 
     <DESCR>Fiets</DESCR> 
    </Row> 
</Root> 

をそして私は次の出力を取得したい:

<Root> 
 
\t <Row> 
 
\t \t <CODE>A001</CODE> 
 
\t \t <DESCR Lang="EN">Car</DESCR> 
 
\t \t <DESCR Lang="FR">Voiture</DESCR> 
 
\t \t <DESCR Lang="NL">Auto</DESCR> 
 
\t </Row> 
 
\t <Row> 
 
\t \t <CODE>A002</CODE> 
 
\t \t <DESCR Lang="EN">Bicycle</DESCR> 
 
\t \t <DESCR Lang="FR">Velo</DESCR> 
 
\t \t <DESCR Lang="NL">Fiets</DESCR> 
 
\t </Row> 
 
</Root>

はこれを変換するための方法で助けに感謝します。ありがとう。

+1

変換用にこれまでに作成したコードを投稿してください。 –

+0

Peter Baileyさんのように、あなたの質問にXSLTを追加してください。また、「私のためのトリックをしない」とはどういう意味ですか?あなたが望む出力を得られませんでしたか?間違いましたか? (2.0プロセッサを使用していない可能性があり、実際にはXSLT 1.0を使用する必要がありますか?) –

答えて

1

質問がXSLT 2.0としてタグ付けされているので、ここではXSLT 2.0溶液である:

<Root> 
    <Row> 
     <CODE>A001</CODE> 
     <DESCR Lang="EN">Car</DESCR> 
     <DESCR Lang="FR">Voiture</DESCR> 
     <DESCR Lang="NL">Auto</DESCR> 
    </Row> 
    <Row> 
     <CODE>A002</CODE> 
     <DESCR Lang="EN">Bicycle</DESCR> 
     <DESCR Lang="FR">Velo</DESCR> 
     <DESCR Lang="NL">Fiets</DESCR> 
    </Row> 
</Root> 

XSLT 1.0

使用Muenchianグルーピング:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="/"> 
     <xsl:element name="Root"> 
      <xsl:for-each-group select="Root/Row" group-by="CODE"> 
       <xsl:element name="Row"> 
        <xsl:copy-of select="CODE"/> 
        <xsl:for-each select="current-group()"> 
         <xsl:element name="DESCR"> 
          <xsl:attribute name = "Lang"> 
           <xsl:value-of select="LANG"/> 
          </xsl:attribute> 
          <xsl:value-of select="DESCR"/> 
         </xsl:element> 
        </xsl:for-each> 
       </xsl:element> 
      </xsl:for-each-group> 
     </xsl:element> 
    </xsl:template> 
</xsl:transform> 

は、必要な出力を生成同じ値の<CODE>ノードを持つをグループ化します。

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    <xsl:key name="codes" match="Root/Row" use="CODE"/> 
    <xsl:template match="/"> 
     <xsl:element name="Root"> 
      <xsl:for-each select="Root/Row[generate-id(.) = generate-id(key('codes',CODE)[1])]"> 
       <xsl:element name="Row"> 
        <xsl:copy-of select="CODE"/> 
        <xsl:for-each select="key('codes',CODE)"> 
         <xsl:element name="DESCR"> 
          <xsl:attribute name = "Lang"> 
           <xsl:value-of select="LANG"/> 
          </xsl:attribute> 
          <xsl:value-of select="DESCR"/> 
         </xsl:element> 
        </xsl:for-each> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 
</xsl:transform> 
+0

グループ化の提案はうまくいきますが、なぜ ' '十分です。 –

+0

ただ一貫している。 を使用しているときにかなりのパフォーマンスオーバーヘッドが発生しますか?プロセッサが要素タグをルートタグに変換する必要があるので、私の推測があるはずです。はいの場合は重要ですか? – Madeyedexter

+1

私はパフォーマンスがプロセッサーに依存していると思っています。個人的には、結果の名前や名前空間の一部を計算する必要がなければ、リテラルな結果要素の代わりに 'xsl:element'を使用することは不必要に冗長で複雑です要素の場合、リテラルの結果要素で十分です。 –

関連する問題