Altova Mailing List Archives>Archive Index >xsl-list Archive Home >Recent entries >Thread Prev - [xsl] only display if subnodes occur more than once [Thread Next] RE: [xsl] only display if subnodes occur more than onceTo: Date: 7/3/2005 5:01:00 PM Clemens,
You could use keys to identify the elements to output. Thus, your input:
<root>
<sub_a>
<elem_1/>
<elem_2/>
<elem_3/>
</sub_a>
<sub_b>
<elem_1/>
<elem_2/>
<elem_2/>
<elem_2/>
<elem_3/>
</sub_b>
<sub_c>
<elem_1/>
<elem_2/>
<elem_3/>
</sub_c>
</root>
Against this transform:
<?xml version="1.0" encoding="iso8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key match="/*/*" name="kElems" use="*"/>
<xsl:template match="root">
<xsl:copy>
<xsl:for-each select="*">
<xsl:if test="count(key('kElems', .)) != count(*)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Yields:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<sub_b>
<elem_1/>
<elem_2/>
<elem_2/>
<elem_2/>
<elem_3/>
</sub_b>
</root>
You could again use a key to identify and eliminate elements such as
<elem_1>. In fact *I* should do that, to match your required output ... but
I need to use a composite key for that ... and it isn't coming to me right
away. If somebody else has more ready insight, please post.
Regards,
--A
From: "Prerovsky, Clemens" <Clemens.Prerovsky@xxxxxxx>
Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Subject: [xsl] only display if subnodes occur more than once
Date: Thu, 23 Jun 2005 12:06:42 +0200
Hi,
I'm stuck again with my XSL. My XML Structure looks like:
<root>
<sub_a>
<elem_1/>
<elem_2/>
<elem_3/>
</sub_a>
<sub_b>
<elem_1/>
<elem_2/>
<elem_2/>
<elem_2/>
<elem_3/>
</sub_b>
<sub_c>
<elem_1/>
<elem_2/>
<elem_3/>
</sub_c>
</root>
The thing I want to do is display the element sub_b, because it has
subnodes which occur more than once (elem_2). I really have no idea how
to test for this - playing around for nearly two hours now. Im using a
loop like <xsl:for-each select="/root/*"> and the output should look
like
sub_b (this is the header)
elem_2
elem_2 (these are the 3 values of elem_2)
elem_2
Best regards,
Clemens Prerovsky
_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today - it's FREE!
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/ | ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
