[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Re: [xslt transform & grouping] Using the Muenchia

Subject: Re: Re: [xslt transform & grouping] Using the Muenchian Method?
From: Anton Triest <anton@xxxxxxxx>
Date: Thu, 30 Sep 2004 09:00:49 +0200
Re:  Re: [xslt transform & grouping] Using the Muenchia
Michael PG wrote:

I still get empty parent nodes that are not filtered, since I left out the info. that attribute filter is also present on the parent node. It can also be empty or contain information.

How can I filter that away as well.

If you say you left out the info, does that mean you don't group anymore, only filter? And in the example below, what do you want to do with Article forename="John"? If you filter out the elements with filter='food', the first Document will not be included. That would leave out John too, although he has a filter='food'.


<Documents>
<Document id="0001" filter="">
<Article title="Mr"/>
<Article forename="John" filter="food"/>
<Article surname="Smith" filter=""/>
</Document>
<Document id="0002" filter="food">
<Article title="Dr"/>
<Article forename="Amy" filter=""/>
<Article surname="Jones" filter="food"/>
</Document>
</Documents>

The best solution depends on what exactly you want to do. If it's plain filtering, a slight variation on the identity template would do:


   <xsl:template match="*">
       <xsl:copy>
           <xsl:copy-of select="@*"/>
           <xsl:apply-templates select="*[@filter='food']"/>
       </xsl:copy>
   </xsl:template>

that would give:

   <Documents>
       <Document id="0002" filter="food">
           <Article surname="Jones" filter="food"/>
       </Document>
   </Documents>

It might be a good idea to put the filter string in a global parameter:

   <xsl:stylesheet ...>
       <xsl:param name="filter" select="'food'"/>
       ...
       <xsl:apply-templates select="*[@filter=$filter]"/>

If you still want to combine grouping and filtering, that's also possible:

<xsl:template match="Documents">
<Documents>
<xsl:for-each select="Document[@filter=$filter]/Article[count(.|key('by-info',@info)[1])=1]">
<Document name="{@info}">
<xsl:copy-of select="key('by-info',@info)[@filter=$filter]"/>
</Document>
</xsl:for-each>
</Documents>
</xsl:template>


Best regards,
Anton

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.