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