xsl-list
[Top] [All Lists]

Re: Re: [xslt transform & grouping] Using the Muenchian Method?

2004-10-07 05:59:02
Thanx!

In this example, where I only user Muenchian method to group, elements where info-attribute doesn't contains anything are also displayed, but not needed. How do I get rid of those elements here?


<?xml version='1.0' encoding='UTF-8'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

        <xsl:key name="by-info" match="Article" use="@info"/>

        <xsl:template match="/Documents">

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

        </xsl:template>

</xsl:stylesheet>

Thank you!

_m


From: David Carlisle <davidc(_at_)nag(_dot_)co(_dot_)uk>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Re: [xslt transform & grouping] Using the Muenchian Method?
Date: Thu, 7 Oct 2004 13:13:10 +0100

You get
$ saxon filter.xml filter.xsl
<?xml version="1.0" encoding="UTF-8"?>
<Documents>
   <Document name="sub">
      <Article title="1.1" info="sub" filter="food"/>
   </Document>
   <Document name="main">
      <Article title="1.2" info="main" filter="food"/>
      <Article title="2.2" info="main" filter="food"/>
   </Document>
   <Document name="child"/>
</Documents>

because of the different ways you filter.
on document you allow "" but in
<xsl:copy-of select="key('by-info',@info)[(_at_)filter=$filter]"/>
you don't.

I think that _is_ what you want, so in your for-each,

<xsl:for-each select="Document[(_at_)filter='' or
@filter=$filter]/Article[generate-id()=generate-id(key('by-info',@info)[(_at_)filter=''
or @filter=$filter])]">

you want to make sure that you always have at least one eleemnt in the
key that really has the filter value and not just "" so that
<xsl:copy-of select="key('by-info',@info)[(_at_)filter=$filter]"/>
always produces something.

you can do that by making the filters on the key() match,
delete     @filter='' or

<xsl:for-each select="Document[(_at_)filter='' or
@filter=$filter]/Article[generate-id()=generate-id(key('by-info',@info)[(_at_)filter=$filter])]">

and you get

$ saxon filter.xml filter.xsl
<?xml version="1.0" encoding="UTF-8"?>
<Documents>
   <Document name="sub">
      <Article title="1.1" info="sub" filter="food"/>
   </Document>
   <Document name="main">
      <Article title="1.2" info="main" filter="food"/>
      <Article title="2.2" info="main" filter="food"/>
   </Document>
</Documents>

David

________________________________________________________________________
This e-mail has been scanned for all viruses by Star. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________

--+------------------------------------------------------------------
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>
--+--


_________________________________________________________________
Don?t just search. Find. Check out the new MSN Search! http://search.msn.click-url.com/go/onm00200636ave/direct/01/



<Prev in Thread] Current Thread [Next in Thread>