|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Chewy key problem
I feel its not possible with pure XSLT 1.0 . We need
to take help of extension function (node-set). Below
is the solution..
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0" xmlns:exslt="http://exslt.org/common"
exclude-result-prefixes="exslt">
<xsl:output method="xml" indent="yes" />
<xsl:key name="by-desc" match="b"
use="concatenated-desc" />
<xsl:template match="/a">
<xsl:variable name="rtf">
<a>
<xsl:for-each select="b">
<b>
<concatenated-desc>
<xsl:call-template
name="concatenate-desc">
<xsl:with-param name="x"
select=".//desc" />
<xsl:with-param name="y" select="''" />
</xsl:call-template>
</concatenated-desc>
<xsl:copy-of select="child::node()" />
</b>
</xsl:for-each>
</a>
</xsl:variable>
<a>
<xsl:for-each
select="exslt:node-set($rtf)/a/b[generate-id(.) =
generate-id(key('by-desc',concatenated-desc)[1])]">
<group-of-b>
<xsl:for-each
select="key('by-desc',concatenated-desc)">
<b>
<xsl:copy-of
select="child::node()[not(self::concatenated-desc)]"
/>
</b>
</xsl:for-each>
</group-of-b>
</xsl:for-each>
</a>
</xsl:template>
<xsl:template name="concatenate-desc">
<xsl:param name="x" />
<xsl:param name="y" />
<xsl:choose>
<xsl:when test="count($x) > 0">
<xsl:call-template name="concatenate-desc">
<xsl:with-param name="x" select="$x[position()
> 1]" />
<xsl:with-param name="y"
select="concat($y,normalize-space($x[1]))" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$y" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
For e.g. when the above XSL is applied to XML -
<a>
<b>
<desc>some text
</desc>
<bChild>
<desc>some other text
</desc>
</bChild>
</b>
<b>
<desc>some text
</desc>
<bChild>
<desc>some other text
</desc>
</bChild>
<bChild>
<desc>maybe some more text
</desc>
</bChild>
</b>
<b>
<desc>some text
</desc>
<bChild>
<desc>some other text
</desc>
</bChild>
<test>xyz</test>
</b>
</a>
The output recieved is -
<?xml version="1.0" encoding="UTF-8"?>
<a>
<group-of-b>
<b>
<desc>some text
</desc>
<bChild>
<desc>some other text
</desc>
</bChild>
</b>
<b>
<desc>some text
</desc>
<bChild>
<desc>some other text
</desc>
</bChild>
<test>xyz</test>
</b>
</group-of-b>
<group-of-b>
<b>
<desc>some text
</desc>
<bChild>
<desc>some other text
</desc>
</bChild>
<bChild>
<desc>maybe some more text
</desc>
</bChild>
</b>
</group-of-b>
</a>
Regards,
Mukul
--- Edmund Mitchell <emitchell@xxxxxxxx> wrote:
> So b elements can have description children (desc),
> and so can their bChild
> children.
>
> The goal is to Meunchian group all the b elements on
> the concatenated value
> of their desc and the desc values of however many
> bChild children there are.
__________________________________
Do you Yahoo!?
Yahoo! Mail - You care about security. So do we.
http://promotions.yahoo.com/new_mail
|
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
|

Cart








