xsl-list
[Top] [All Lists]

Re: [xsl] Wrap changing element sequence into container: with 'for-each-group'?

2007-01-26 03:34:41
Hi Yves,

You did not show how the output should really look like. But I suppose "inside a <b> container" means a <b> element with children <b1>, <b2> etc. Here's what I came up with, which does not involve grouping, but instead uses mode-switching. If you have textual content in your real input, you may need some changes, because I neglect the default template below.

Output of below stylesheet on your input:

<a>
  <b>
     <b1/>
     <b2/>
  </b>
  <c/>
</a>
<a>
  <b>
     <b2/>
  </b>
  <c/>
</a>


The Stylesheet:

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

   <xsl:output indent="yes" />
<xsl:template match="/">
       <xsl:apply-templates select="$abc/*" />
   </xsl:template>
<xsl:template match="*[starts-with(name(), 'b')][1]">
       <b>
           <xsl:apply-templates
               select="self::* | following-sibling::*"
               mode="b"/>
       </b>
   </xsl:template>
<xsl:template match="*[starts-with(name(), 'b')]" mode="b">
       <xsl:copy>
           <xsl:apply-templates select="node() | @*" mode="#current"/>
       </xsl:copy>
   </xsl:template>

   <!-- copy all others -->
   <xsl:template match="*[not(starts-with(name(), 'b'))]">
       <xsl:copy>
           <xsl:apply-templates select="node() | @*" />
       </xsl:copy>
   </xsl:template>
</xsl:stylesheet>



Cheers,
-- Abel Braaksma
  http://www.nuntia.nl

Yves Forkl wrote:
Given two XML fragments

<a>
 <b1/>
 <b2/>
 <c/>
</a>

and

<a>
 <b2/>
 <c/>
</a>

I would like to wrap <b1/><b2/> into a <b/> container, and the same should happen to <b2/> when occurring alone. The other elements can be assumed to remain unchanged.

While I found quite some hints on solving grouping problems in the XSLT FAQ and in the XSL list archive, I can't figure out how to solve this wrapping task using XSLT 2.0. There is an interesting posting here: http://www.biglist.com/lists/xsl-list/archives/200201/msg00804.html But I don't know how this could serve as a basis for a solution to my problem.

I suspect that "for-each-group" should be my friend; how would I need to use it here? Or is there any other, more elegant solution?

Yours,

  Yves


--~------------------------------------------------------------------
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>
--~--





--~------------------------------------------------------------------
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>
--~--