xsl-list
[Top] [All Lists]

RE: [xsl] xsl-grouping two different elements together

2010-03-16 11:12:08

group-starting-with="abs" would solve the problem for this example, but I've
no idea if it solves the general problem.

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay 

 

-----Original Message-----
From: gregor FELLENZ [mailto:gregor(_at_)netzfrei(_dot_)org] 
Sent: 16 March 2010 14:42
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] xsl-grouping two different elements together

hey all,

i've got another grouping problem. i'm a little stuck where 
to look for.

given the following structure:

<?xml version="1.0" encoding="UTF-8"?>
<kapitel>
      <abs>first</abs>
      <einschub1>first_ein</einschub1>
      <einschub1>second_ein</einschub1>
      <leerzeile/>
      <einschub1>third_ein</einschub1>
      <abs>second</abs>
      <einschub2>first_ein2</einschub2>
      <abs>end</abs>
</kapitel>

this should transform to:

<?xml version="1.0" encoding="UTF-8"?>
<kapitel>
      <abs>first</abs>
      <einschub typ="1">
              <abs>first_ein</abs>
              <abs>second_ein</abs>
              <leerzeile/>
              <abs>third_ein</abs>
      </einschub>
      <abs>second</abs>
      <einschub typ="2">
              <abs>first_ein2</abs>
      </einschub>
      <abs>end</abs>
</kapitel>

my current xslt is:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
      xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
exclude-result-prefixes="xs" version="2.0">
      
      
      <xsl:template match="@*|node()">
              <xsl:copy>
                      <xsl:apply-templates select="@*|node()"/>
              </xsl:copy>
      </xsl:template>
      
      <xsl:template match="kapitel">
              <xsl:element name="kapitel">
                      <xsl:for-each-group select="*" 
group-adjacent="local-name()" >
                              <xsl:choose>
                                      <xsl:when 
test="starts-with(current-grouping-key(),'einschub')">
                                                              
<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>

</xsl:stylesheet>

but this creates two <einschub typ="1"> container. this makes 
absolutely sense, but i've no idea how to get the <leerzeile> 
element into the container.

my only idea is to make a 2 pass solution:
1. rename all <leerzeile> elements with a template ... 
<xsl:when 
test="preceding-sibling::*[1][starts-with(local-name(),'einsch
ub')]  and 
following-sibling::*[1][starts-with(local-name(),'einschub')] 
"> <xsl:element name="{local-name(preceding-sibling::*[1])}"> ...
2. grouping works.


is there any better/more elegant solution? or ideas where to look for?

thanks in advance,
regards,
gregor

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