xsl-list
[Top] [All Lists]

Re: Joining sibling elements

2005-08-11 03:22:19
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 Miłkowski <milek_pl(_at_)o2(_dot_)pl> 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
<Prev in Thread] Current Thread [Next in Thread>