2013-03-13 94 views
1

我具有以下XML(簡化爲目的)組相鄰的語法建議需要

<content> 
<p1>blabla</p1> 
<p2>blabla</p2> 
<p2>blabla</p2> 
<p1>blabla</p1> 
<p3>blabla</p3> 
<p1>blabla</p1> 
<p2>blabla</p2> 
<p2>blabla</p2> 
<p1>blabla</p1> 
<p3>blabla</p3> 
<p2>blabla</p2> 
</content> 

和我想組的所有元件P1和P2的元素,但後者只有當前一個兄弟是p1元素。

我用下面的XSLT:

<xsl:for-each-group select="*" group-adjacent="self::p1 or (self::p2 and preceding-sibling::p1[1])"> 
        <xsl:choose> 
         <xsl:when test="current-grouping-key()"> 
          <ol_coll> 
           <xsl:apply-templates select="current-group()"/> 

          </ol_coll> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:apply-templates select="current-group()"/> 
         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:for-each-group> 

但我俯瞰我的語法的東西,因爲它不看第一前次元素,但在整個樹。所以,我獲得以下收益

<content> 
<ol_coll> 
    <p1>blabla</p1> 
    <p2>blabla</p2> 
    <p2>blabla</p2> 
    <p1>blabla</p1> 
</ol_coll> 
<p3>blabla</p3> 
<ol_coll> 
    <p1>blabla</p1> 
    <p2>blabla</p2> 
    <p2>blabla</p2> 
    <p1>blabla</p1> 
</ol_coll> 
<p3>blabla</p3> 
<ol_coll> 
    <p2>blabla</p2> 
</ol_coll> 
    </content> 

,但我所希望的是以下幾點:

<content> 
<ol_coll> 
    <p1>blabla</p1> 
    <p2>blabla</p2> 
</ol_coll> 
<p2>blabla</p2> 
<p1>blabla</p1> 
<p3>blabla</p3> 
<ol_coll> 
    <p1>blabla</p1> 
    <p2>blabla</p2> 
</ol_coll> 
<p2>blabla</p2> 
<p1>blabla</p1> 
<p3>blabla</p3> 
<p2>blabla</p2> 
</content> 

任何人都可以點我到我的錯誤?謝謝 !

回答

2

我認爲您需要將條件更改爲preceding-sibling::*[1][self::p1],然後您需要確保不要包裝單個元素。所以用

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

<xsl:strip-space elements="*"/> 
<xsl:output indent="yes"/> 

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="content"> 
    <xsl:copy> 
      <xsl:for-each-group select="*" group-adjacent="self::p1 or (self::p2 and preceding-sibling::*[1][self::p1])"> 
        <xsl:choose> 
         <xsl:when test="current-grouping-key() and current-group()[2]"> 
          <ol_coll> 
           <xsl:apply-templates select="current-group()"/> 

          </ol_coll> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:apply-templates select="current-group()"/> 
         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

我得到你發佈的結果(運行撒克遜9.4)。