如何对.xml文件进行排序并根据ID条目合并部分

时间:2017-03-31 15:00:44

标签: xml xslt

我有一个.xml文件,其中包含两组我希望根据其ID值(1.2)相互匹配的信息。例如,这个片段。

<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>

1 个答案:

答案 0 :(得分:2)

这是所谓的Muenchian grouping的变种 以下XSLT选择所有<xsl:key>的已排序<rule>的第一个匹配项,然后通过应用{将所有<rule>与相同的@id匹配来编译所需的结果带有谓词的{1}}运算符。

//