[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Joining sibling elements


Subject: Re: [xsl] Joining sibling elements
From: Marcin Miłkowski <milek_pl@xxxxx>
Date: Thu, 11 Aug 2005 11:06:36 +0200

Hi Mukul,

this is a good idea and I'll try to use variables for comparing. Note that I have to retain all attributes and elements which is quite tricky in scenarios like:

<a><b atr1="12"><c><d>text</d></c></b><b atr1="12><c><d> </d></c><b><b atr1="13"><c><d>etc.</d></c><b>

especially when I cannot predict which and how many elements would appear under <b> but I know that <d> contains only text value.

Seems to me I have to compare rtfs containing all elements except for <d>. So I would try to create two variables: first one containing such rtf of the current <b>, and a second one containing following-sibling of this current <b>. If they are the same, copy text() from <d> to the rtf of current <b>, and write this rtf to the output. If not, write both rtfs to the output.

The problem is that I don't know how to construct the for-each statement to process exactly the current <b> and its following sibling, and to skip the following sibling from processing...

Best regards,
	Marcin



Mukul Gandhi wrote:
Given this XML -
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <a><b>this</b><b>this 1</b><b>this 2</b></a>
  <a><b>this 3</b></a>
  <a><b>this 4</b><b>this 5</b></a>
  <a><b>this 6</b><b>this 7</b><b>this 8</b><b>this 9</b></a>
  <a><b>this 10</b><b>this 11</b><b>this 12</b><b>this 13</b></a>
</root>

This XSLT stylesheet -
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0" xmlns:common="http://exslt.org/common"
exclude-result-prefixes="common">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/root">
<root>
<xsl:apply-templates select="a"/>
</root> </xsl:template>


<xsl:template match="a">
   <b>
     <xsl:variable name="rtf"><xsl:for-each select="b"><xsl:value-of
select="."/><xsl:text> </xsl:text></xsl:for-each></xsl:variable>
     <xsl:value-of select="common:node-set($rtf)/text()"/>
   </b>
</xsl:template>
	
</xsl:stylesheet>

Produces following output -
<?xml version="1.0" encoding="utf-8"?>
<root>
   <b>this this 1 this 2 </b>
   <b>this 3 </b>
   <b>this 4 this 5 </b>
   <b>this 6 this 7 this 8 this 9 </b>
   <b>this 10 this 11 this 12 this 13 </b>
</root>

Hope this helps,

Regards,
Mukul


Current Thread
Keywords