xsl-list
[Top] [All Lists]

Re: [xsl] block selection question (XSLT 1.0)

2011-05-07 04:45:17
Thank you all for the different solutions.

I tested the three XSLT 1.0 solutions and they work fine.
It is really interesting, how many different approaches are possible:
* sibling recursion
* closing tag counting (XPath)
* grouping by xsl:key

Also the current-group XSLT 2.0 approach is good to know.


Mit besten Gruessen / Best wishes,

Hermann Stamm-Wilbrandt
Developer, XML Compiler, L3
Fixpack team lead
WebSphere DataPower SOA Appliances
https://www.ibm.com/developerworks/mydeveloperworks/blogs/HermannSW/
----------------------------------------------------------------------
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martin Jetter
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294 



From:   Martin Honnen <Martin(_dot_)Honnen(_at_)gmx(_dot_)de>
To:     xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Date:   05/06/2011 11:45 AM
Subject:        Re: [xsl] block selection question (XSLT 1.0)



Hermann Stamm-Wilbrandt wrote:

I know that this is basic but I cannot get it done correctly.

Input:
<lines>
   <line></line>
   <line>A1</line>
   <line>1</line>
   <line>B1</line>
   <line></line>
   <line>A2</line>
   <line>2</line>
   <line>2</line>
   <line>2</line>
   <line>B2</line>
   <line></line>
   <line></line>
</lines>

Intended output (blockwise, start at A, all including next B):
<line>A1</line>
<line>1</line>

<line>A2</line>
<line>2</line>
<line>2</line>
<line>2</line>


The following stylesheet outputs the above result:

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

   <xsl:output indent="yes"/>

   <xsl:key name="k1"
     match="line[not(starts-with(., 'A')) and not(starts-with(. , 'B')) 
and node()]"
     use="generate-id(preceding-sibling::line[starts-with(., 'A')][1])"/>

   <xsl:template match="@* | node()" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="@* | node()"/>
     </xsl:copy>
   </xsl:template>

   <xsl:template match="lines">
     <xsl:apply-templates select="line[starts-with(., 'A')]"/>
   </xsl:template>

   <xsl:template match="line[starts-with(., 'A')]">
     <xsl:call-template name="identity"/>
     <xsl:apply-templates select="key('k1', generate-id())"/>
   </xsl:template>

</xsl:stylesheet>

I am however not sure whether the condition used
   "and node()"
is what you want.


-- 

                 Martin Honnen
                 http://msmvps.com/blogs/martin_honnen/

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

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