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

Subject: Re: [xsl] Re: [xslt transform & grouping] Using the Muenchian Method?
From: "Michael PG" <xrow@xxxxxxx>
Date: Tue, 05 Oct 2004 10:02:11 +0000
I am also unable to use params and apply-templates in this order below since I get

"Exception Details: System.Xml.Xsl.XsltException: 'xsl:apply-templates' cannot be a child of 'xsl:stylesheet' element."

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


So I have to put apply-templates under <xsl:template match="Documents">.


Still empty output XML.

I have also to remove quote marks from select=" ' food ' " so select=" food " otherwise:

"Exception Details: System.NullReferenceException: Object reference not set to an instance of an object."

But Still empty output XML.


Thank you in advance.



/Michael





From: Anton Triest <anton@xxxxxxxx>
Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Re: [xslt transform & grouping] Using the Muenchian Method?
Date: Thu, 30 Sep 2004 09:00:49 +0200


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


_________________________________________________________________
FREE pop-up blocking with the new MSN Toolbar  get it now! http://toolbar.msn.click-url.com/go/onm00200415ave/direct/01/


Current Thread