2011-02-17 42 views
0

我有下面的样品嵌套的XML嵌套分组的for-each-组

<?xml version="1.0" encoding="UTF-8"?> 
<text> 
    <main> 
     <div n="Section 1"> 
      <milestone unit="fragment"/> 

      <div rend="header"> 
       <head>One</head> 
      </div> 
     </div> 

     <div n="Section 2"> 
      <milestone unit="fragment"/> 

       <div rend="header"> 
       <head>Two</head> 
       </div> 

      <div> 
       <p>Para 1</p> 
       <p>Para 2</p> 
       <p>Para 3</p> 

       <milestone unit="fragment"/> 

       <p>Para 4</p> 
       <p>Para 5</p> 
       <p>Para 6</p> 

       <milestone unit="fragment"/> 

       <p>Para 7</p> 
       <p>Para 8</p> 
       <p>Para 9</p> 

      </div> 
     </div> 
    </main> 
</text> 

我试图组成的片段是这样的:

<div n="1"> 
     One 
    </div> 

    <div n="2"> 
     Two 

     Para 1 
     Para 2 
     Para 3 

    </div> 

    <div n="3"> 
     Para 4 
     Para 5 
     Para 6 
    </div> 

    <div n="4"> 
     Para 7 
     Para 8 
     Para 9 
    </div> 

这是我的XSLT使用

<xsl:template match="/"> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="text"> 
    <xsl:for-each select="main/div"> 
     <xsl:for-each-group select="*" group-starting-with="milestone[@unit='fragment']"> 
      <xsl:for-each select="current-group()" > 
       <xsl:variable name="fragNum"><xsl:number count="milestone[@unit='fragment']" level="any" from="body"/></xsl:variable> 
       <div n="{$fragNum}"> 
        <xsl:apply-templates select="."/>  
       </div> 
      </xsl:for-each> 
     </xsl:for-each-group> 
    </xsl:for-each> 
</xsl:template> 

这是对输出的变换:

<div n=""/> 
     <div n=""> 
      One 
     </div> 
     <div n=""/> 
    <div n=""> 
     Two 
    </div> 
    <div n=""> 
     Para 1 
     Para 2 
     Para 3 



     Para 4 
     Para 5 
     Para 6 



     Para 7 
     Para 8 
     Para 9 
    </div> 

即使我告诉了,每个组的分组应该以“里程碑开始[@单位=‘片断’]为什么会在里程碑标签嵌套在div中时忽略它?

+0

可能是因为里程碑是一个空元素?我不知道xslt 2,但确定这很简单,用xslt 1 – Treemonkey 2011-02-17 10:22:35

回答

2

随着样式表是

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="text"> 
    <xsl:for-each-group select="descendant::*[not(*)]" 
     group-starting-with="milestone[@unit = 'fragment']"> 
     <div n="{position()}"> 
     <xsl:value-of select="current-group()" separator="&#10;"/> 
     </div> 
    </xsl:for-each-group> 
    </xsl:template> 

</xsl:stylesheet> 

撒克逊9个输出

<div n="1"> 
One</div> 
<div n="2"> 
Two 
Para 1 
Para 2 
Para 3</div> 
<div n="3"> 
Para 4 
Para 5 
Para 6</div> 
<div n="4"> 
Para 7 
Para 8 
Para 9</div> 
+0

+1非常好的答案。除此之外,这种情况下不需要,我会去除`current-group()之外的标记,除了.`或`current-group()[position()ne 1]` – 2011-02-17 14:55:11

0

看起来你只需要在for-each-group中选择main/div的子元素。因此,(从每个组元素的角度来看),嵌套在div的下一层中没有嵌套元素milestone