2015-09-22 59 views
0

兩次我有一個這樣的XML,XSLT -Grouping相同的內容

<doc> 
    <section> 
     <p id="main">aa</p> 
     <p id="main">bb</p> 
     <p id="main">cc</p> 
     <p id="para1">dd</p> 
     <p id="st_main">ee</p> 
     <p id="st_main">ff</p> 
     <p id="main">cc</p> 
     <p id="main">cc</p> 
     <p id="main">gg</p> 
     <p id="para2">hh</p> 
     <p id="main">ii</p> 
     <p id="st_main">jj</p> 
     <p id="st_main">cc</p> 
     <p id="main">cc</p> 
     <p id="para1">xx</p> 
     <p id="main">yy</p> 
     <p id="st_main">zz</p> 
     <p id="main">cc</p> 
    </section> 
</doc> 

我的要求是

1)分組由para屬性<p>並添加單獨的部分到每個<p>組。

2)識別<p>節點組,其id屬性從st開始放<st_start><st_end>在開始和在組

SO預期輸出結束時,

<doc> 
    <section> 
     <p id="main">aa</p> 
     <p id="main">bb</p> 
     <p id="main">cc</p> 
    </section> 
    <section type="para1"> 
     <p id="para1">dd</p> 
     <ss_start/> 
     <p id="st_main">ee</p> 
     <p id="st_main">ff</p> 
     <ss_end/> 
     <p id="main">cc</p> 
     <p id="main">cc</p> 
     <p id="main">gg</p> 
    </section> 
    <section type="para2"> 
     <p id="para2">hh</p> 
     <p id="main">ii</p> 
     <ss_start/> 
     <p id="st_main">jj</p> 
     <p id="st_main">cc</p> 
     <ss_end/> 
     <p id="main">cc</p> 
    </section> 
    <section type="para1"> 
     <p id="para1">xx</p> 
     <p id="main">yy</p> 
     <ss_start/> 
     <p id="st_main">zz</p> 
     <ss_end/> 
     <p id="main">cc</p> 
    </section> 
</doc> 

我可以做到這一點任務分別使用以下xsl

<xsl:template match="section"> 
     <xsl:for-each-group select="p" group-starting-with="p[starts-with(@id, 'para')]"> 
      <section> 
       <xsl:if test="current-group()[1][not(@id='main')]"> 
        <xsl:attribute name="type" select="current-group()[1]/@id"/> 
       </xsl:if> 
       <xsl:apply-templates select="current-group()"/> 
      </section> 
     </xsl:for-each-group> 
    </xsl:template> 


<xsl:template match="section"> 
     <xsl:copy> 
      <xsl:for-each-group select="*" group-adjacent="starts-with(@id, 'st')"> 
       <xsl:if test="current-grouping-key()"> 
        <ss_start/> 
       </xsl:if> 
       <xsl:apply-templates select="current-group()"/> 
       <xsl:if test="current-grouping-key()"> 
        <ss_end/> 
       </xsl:if> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

但是我無法將這兩個代碼一起運行並獲得所需的輸出。

任何人都可以建議如何組合上面的兩個代碼,並獲得預期的輸出?

回答

1

您實際上需要將代碼嵌套在第一個模板的xsl:for-each-group內的第二個模板中,因此您不需要做<xsl:apply-tempates select="current-group()" />而是<xsl:for-each-group select="current-group()" ... />

試試這個單一模板:

<xsl:template match="section"> 
    <xsl:for-each-group select="p" group-starting-with="p[starts-with(@id, 'para')]"> 
     <section> 
      <xsl:if test="current-group()[1][not(@id='main')]"> 
       <xsl:attribute name="type" select="current-group()[1]/@id"/> 
      </xsl:if> 
      <xsl:for-each-group select="current-group()" group-adjacent="starts-with(@id, 'st')"> 
       <xsl:if test="current-grouping-key()"> 
        <ss_start/> 
       </xsl:if> 
       <xsl:apply-templates select="current-group()"/> 
       <xsl:if test="current-grouping-key()"> 
        <ss_end/> 
       </xsl:if> 
      </xsl:for-each-group> 
     </section> 
    </xsl:for-each-group> 
</xsl:template>