2017-03-31 60 views
0

我有一个.xml文件,其中包含两组我想根据ID值(1.2)彼此匹配的信息。例如,这个片段。如何对.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的变体。
以下XSLT选择所有<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> 
相关问题