Re: [xsl] Joining sibling elements

Subject: Re: [xsl] Joining sibling elements
From: Mukul Gandhi <gandhi.mukul@xxxxxxxxx>
Date: Thu, 11 Aug 2005 15:52:19 +0530
Hi Marcin,
   I think, in this case we have to follow some hard coding approach.
IMHO, I think there is a point when automation of XSLT Stylesheet
writing is not feasible.

I tried to rework the example you gave.

Given this XML -
(now b elements exist even deeper)

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

This stylesheet produces the same output -
<?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="c"/>
   </root>  
</xsl:template>

<xsl:template match="c">
    <xsl:apply-templates select="a"/>		
</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>

Regards,
Mukul

On 8/11/05, Marcin Mi3kowski <milek_pl@xxxxx> wrote:
> 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

Current Thread