[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] 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>
any help is greatly appreciated!
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|