2013-03-13 2 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> 

게시 한 결과 (Saxon 9.4 실행)가 나타납니다.