2017-03-31 10 views
0

私はID値(1.2)に基づいてお互いに一致させたい2組の情報を含む.xmlファイルを持っています。たとえば、このスニペット。.xmlファイルをソートし、IDエントリに基づいてセクションをマージする方法

<rule id="1.2"> 
     <checker id="checker.id"> 
     <description locale="en">description</description> 
     </checker> 
</rule> 

<rule id="1.2"> 
     <checker> 
      <category locale="en">Advisory</category> 
      <decidable locale="en">Yes</decidable> 
     </checker> 
</rule>  

私は各ルールについての.xslを持って、テーブルエントリに値を追加

<row> 
    <entry> 
     <xsl:value-of select="@id"/>                  
    </entry> 
    <entry> 
     <xsl:for-each select="checker"> 
     <xsl:value-of select="category[@locale=$locale]"/> 
     </xsl:for-each> 
    </entry> 
    <entry> 
     <xsl:for-each select="checker"> 
     <xsl:value-of select="decidable[@locale=$locale]"/> 
     </xsl:for-each> 
    </entry> 
    <entry> 
     <xsl:for-each select="checker"> 
     <p> 
     <codeph> 
     <xsl:value-of select="@id"/></codeph><xsl:text>&#160;</xsl:text> 
     <xsl:value-of select="description[@locale=$locale]"/> 
     </p> 
     </xsl:for-each>         
    </entry>          
</row> 

現在の結果は私にこれを与えるが、IDがあるにもかかわらず、それは二つの別々の行を作成しました同じ。同じIDの情報を同じ行に表示するにはどうすればよいですか?

<row> 
    <entry>1.2</entry> 
    <entry>Advisory</entry> 
    <entry>Yes</entry> 
    <entry> 
    <p> 
    <codeph/></p> 
    </entry> 
</row> 
<row> 
    <entry>1.2</entry> 
    <entry/> 
    <entry/> 
    <entry> 
    <p> 
    <codeph>checker.id</codeph>description</p> 
    </entry> 
</row> 

望ましい結果:

<row> 
    <entry>1.2</entry> 
    <entry>Advisory</entry> 
    <entry>Yes</entry> 
    <entry> 
    <p><codeph>checker.id</codeph>description</p> 
    </entry> 
</row> 
+0

希望の結果で編集 – albinosilver

答えて

2

これはMuenchian groupingいわゆるの変種です。
すべての<rule>のソートされた<xsl:key>の最初の一致が選択され、次に演算子を述語で適用することによって、<rule>をすべて@idに一致させることによって目的の結果をコンパイルします。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:key name="kSorted" match="rule" use="@id" /> 
    <xsl:variable name="locale" select="'en'" /> 

    <xsl:template match="/root"> 
     <xsl:apply-templates select="rule[generate-id() = generate-id(key('kSorted',@id)[1])]"> 
     <xsl:sort select="@id" /> 
     </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="rule"> 
     <xsl:variable name="thisID" select="@id" /> 
     <row> 
     <entry><xsl:value-of select="@id"/></entry> 
     <entry><xsl:value-of select="//rule[@id = $thisID]//category[@locale=$locale]"/></entry> 
     <entry><xsl:value-of select="//rule[@id = $thisID]//decidable[@locale=$locale]"/></entry> 
     <entry> 
      <p> 
      <codeph><xsl:value-of select="checker/@id"/></codeph><xsl:text>&#160;</xsl:text> 
      <xsl:value-of select="checker/*[@locale=$locale][1]"/> 
      </p> 
     </entry>          
     </row> 
    </xsl:template> 

</xsl:stylesheet> 
関連する問題