xsl-list
[Top] [All Lists]

RE: only display if subnodes occur more than once

2005-07-03 10:01:06
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(_dot_)Prerovsky(_at_)beko(_dot_)at>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
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/


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--