xsl-list
[Top] [All Lists]

RE: Enclosing following-sibling nodes before the next element of the same type

2004-11-11 23:05:11
Hi,

How can I transform the following XML:

<parent><elem/>text<br/><elem/>word<hr/>word<elem/></parent>

to

<parent>
<elem>text<br/></elem>
<elem>word<hr/>word</elem>
</parent>

I'd like <elem> to enclose all its following-siblings up to 
either the the next
<elem> or the end tag of its parent element.
How can I do this in XSLT ? Anyone know how can I select these nodes ?

This is a FAQ, a grouping problem. See Jeni's pages 
<http://jenitennison.com/xslt/grouping> for more info.

  <xsl:template match="parent">
    <xsl:copy>
      <xsl:apply-templates select="elem[1]"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="elem">
    <xsl:if test="following-sibling::elem[1]">
      <xsl:copy>
        <xsl:apply-templates select="following-sibling::node()[1]" 
mode="group"/>
      </xsl:copy>
      <xsl:apply-templates select="following-sibling::elem[1]"/>
    </xsl:if>
  </xsl:template>
  <xsl:template match="node()" mode="group">
    <xsl:copy>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
    <xsl:apply-templates select="following-sibling::node()[1]" mode="group"/>
  </xsl:template>
  <xsl:template match="elem" mode="group"/>
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

Cheers,

Jarno

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>