|
Subject: RE: [xsl] grouping with xsl:for-each-group From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 21 Apr 2009 09:56:58 +0100 |
Try:
<xsl:for-each-group select="*" group-adjacent="local-name()">
<xsl:choose>
<xsl:when test="starts-with(current-grouping-key(), 'einschub')">
<einschub typ='replace(local-name(), "[^\d]+", "")'>
<xsl:apply-templates select="current-group()"/>
</einschub>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: gregor FELLENZ [mailto:gregor@xxxxxxxxxxxx]
> Sent: 21 April 2009 09:47
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] grouping with xsl:for-each-group
>
> hi there,
>
> i've got a flat xml document and need some hierachy in there.
> the first approach was promising, but now i'm stuck how to
> fix the last bit.
> i think i could do a procedural style, but i guess theres an
> elegant solution for the problem.
>
> i would like to put any group of "einschub" elements in a
> separate container. this works fine when there's an other
> element inbetween. but fails with different "einschub"
> sibling-elements.
>
> step by step:
> 1. source doc:
> <kapitel>
> <abs>abs</abs>
> <einschub1>einschub1</einschub1>
> <einschub1>einschub1</einschub1>
> <abs>abs</abs>
> <einschub1>einschub1</einschub1>
> <einschub2>einschub2</einschub2>
> <abs>abs</abs>
> <abs>abs</abs>
> </kapitel>
>
> 2. xslt
> <xsl:template match="kapitel">
> <xsl:element name="kapitel">
> <xsl:for-each-group select="*"
> group-adjacent="starts-with(local-name(),'einschub')" >
> <xsl:choose>
> <xsl:when test="current-grouping-key()">
> <xsl:element name="einschub">
> <xsl:attribute name="typ"
> select='replace(local-name(), "[^\d]+", "")'/>
> <xsl:apply-templates
> select="current-group()"/>
> </xsl:element>
> </xsl:when>
> <xsl:otherwise>
> <xsl:apply-templates select="current-group()"/>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:for-each-group>
> </xsl:element>
> </xsl:template>
>
> <xsl:template match="einschub1|einschub2">
> <xsl:element name="abs">
> <xsl:apply-templates/>
> </xsl:element>
> </xsl:template>
>
> 3. output with saxon9
> <kapitel>
> <abs>abs</abs>
> <einschub typ="1">
> <abs>einschub1</abs>
> <abs>einschub1</abs>
> </einschub>
> <abs>abs</abs>
> <einschub typ="1">
> <abs>einschub1</abs>
> <abs>einschub2</abs>
> </einschub>
> <abs>abs</abs>
> <abs>abs</abs>
> </kapitel>
>
>
> 4. desired output
> <kapitel>
> <abs>abs</abs>
> <einschub typ="1">
> <abs>einschub1</abs>
> <abs>einschub1</abs>
> </einschub>
> <abs>abs</abs>
> <einschub typ="1">
> <abs>einschub1</abs>
> </einschub>
> <einschub typ="2">
> <abs>einschub2</abs>
> </einschub>
> <abs>abs</abs>
> <abs>abs</abs>
> </kapitel>
>
> any help is greatly appreciated!
>
>
> all the best,
> gregor
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] grouping with xsl:for-eac, gregor FELLENZ | Thread | [xsl] enclosing attribute in single, H H |
| Re: [xsl] grouping with xsl:for-eac, David Carlisle | Date | Re: [xsl] grouping with xsl:for-eac, gregor FELLENZ |
| Month |