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

Re: Xslt transform & grouping, Using the Muenchian Me

Subject: Re: Xslt transform & grouping, Using the Muenchian Method?
From: "row.filter" <row.filter@xxxxxxxxx>
Date: Mon, 11 Oct 2004 10:35:18 +0200
xslt row
One more thing.
I also get all elements where filter=''. I need to get only
filter='food' and filter='drink', wheter element is child element
(Article) or parent element (Document), then I want to sort according
to title-attribute.

Thank you!


On Mon, 11 Oct 2004 10:10:32 +0200, row.filter <row.filter@xxxxxxxxx> wrote:
> ok.
> 
> Is this correct?
> I got some parent elements (Document) node hanging outside for some reason?
> 
> I would like also to filter on two attributes. It this correct
> (<xsl:copy-of select="@* | Article[@filter = 'food' or @filter=
> 'drink']"/>) ?
> 
> 
> <?xml version="1.0"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
> 
>  <xsl:template match="/">
>  <Documents>
>        <xsl:apply-templates select="Documents/Document[@filter = 'food' or
> @filter = '']">
>        <xsl:sort select="@title"/>
>        </xsl:apply-templates>
>  </Documents>
>  </xsl:template>
> 
>  <xsl:template match="/Documents/Document">
>    <xsl:copy>
>        <xsl:copy-of select="@* | Article[@filter = 'food']"/>
>    </xsl:copy>
>  </xsl:template>
> 
> </xsl:stylesheet>
> 
> 
> 
> 
> On Mon, 11 Oct 2004 09:19:16 +0200, Anton Triest <anton@xxxxxxxx> wrote:
> > row.filter wrote:
> >
> > >I get this exception:
> > >
> > >Exception Details: System.Xml.Xsl.XsltException: 'local-name()' is an
> > >invalid QName.
> > >
> > That's correct, you cannot use expressions in xsl:element name unless
> > you enclose them
> > in curly braces: <xsl:element name="{local-name()}">
> >
> > The next problem will be that every Document in the output will be
> > nested inside another
> > Document element, because of the <xsl:copy>.
> >
> > Infact, <xsl:copy> and <xsl:element name="{local-name()}"> do the same
> > thing so you
> > only need one of them (or use just <Document> instead).
> >
> > The code will also add multiple Document elements at the root level,
> > making it invalid XML
> > (an XML document should always have one root element). To ensure that
> > the output has
> > one root node, add <Documents> to the template match="/" (or, if you
> > prefer, use
> > match="/Documents" and then <xsl:copy>).
> >
> > HTH,
> > Anton
> >
> >
> >
> > >On Sun, 10 Oct 2004 11:27:20 -0700, M. David Peterson
> > ><m.david@xxxxxxxxxx> wrote:
> > >
> > >
> > >>I'm not sure if using keys is necessary as it seems they are already grouped
> > >>using the document order and hierarchy.  Either way, to ensure that they are
> > >>processed numerically if and only if the @filter attribute equals food or has no
> > >>value and then further more only include Article elements within each Document
> > >>structure that contain the @filter equal to food then your problem is pretty
> > >>simple...
> > >>
> > >><?xml version="1.0"?>
> > >><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
> > >><xsl:template match="/">
> > >>  <xsl:apply-templates select="Documents/Document[@filter = 'food' or @filter =
> > >>'']">
> > >>    <xsl:sort select="@title"/>
> > >>  </xsl:apply-templates>
> > >>  </xsl:template>
> > >>  <xsl:template match="Document">
> > >>    <xsl:copy>
> > >>      <xsl:element name="local-name()">
> > >>        <xsl:copy-of select="@* | Article[@filter = 'food']"/>
> > >>      </xsl:element>
> > >>    </xsl:copy>
> > >>  </xsl:template>
> > >></xsl:stylesheet>
> > >>
> > >>Produces this using your sample XML input:
> > >>
> > >><Document title="1" chapter="1" href="file1.xml" filter="food">
> > >>  <Article title="1.1" info="sub" filter="food"/>
> > >>  <Article title="1.2" info="main" filter="food"/>
> > >></Document>
> > >><Document title="3" chapter="3" href="file2.xml" filter=""/>
> > >>
> > >>If this is not the output you want maybe an example of what you want the output
> > >>to look like will help us help you further.
> > >>
> > >>Best of luck!
> > >>
> > >><M:D/>
> > >>
> > >>
> > >>
> > >>
> > >>row.filter wrote:
> > >>
> > >>
> > >>>Hi,
> > >>>
> > >>>I would like to group following, by attribute Title, and then filter
> > >>>by attribute filter="food". Title-attribute exists in both Document
> > >>>and Article elements.
> > >>>
> > >>>That is, groups should be created based on attribute Title in Document
> > >>>element, and filtered by attribute e.g. filter="food".
> > >>>
> > >>>Currently I am using grouping and filtering in following stylesheet.
> > >>>
> > >>>All other elements, where filter != "food" should be ignored.
> > >>>Filter is global parameter.
> > >>>
> > >>>Thank you!
> > >>>
> > >>>
> > >>>Some help on the way:
> > >>>
> > >>>XSL:
> > >>>
> > >>><?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:param name="filter" select="'food'"/>
> > >>>
> > >>><xsl:template match="Documents">
> > >>>      <Documents>
> > >>>              <xsl:for-each select="Document[@filter='' or
> > >>>@filter=$filter]/Article[generate-id()=generate-id(key('by-info',@info)[@filter=$filter])]">
> > >>>                      <Document name="{@info}">
> > >>>                              <xsl:copy-of select="key('by-info',@info)[@filter=$filter]"/>
> > >>>                      </Document>
> > >>>              </xsl:for-each>
> > >>>      </Documents>
> > >>></xsl:template>
> > >>>
> > >>></xsl:stylesheet>
> > >>>
> > >>>
> > >>>XML:
> > >>>
> > >>><Documents>
> > >>>      <Document title="1" chapter="1" href="file1.xml" filter="food">
> > >>>              <Article title="1.1" info="sub" filter="food"/>
> > >>>              <Article title="1.2" info="main" filter="food"/>
> > >>>      </Document>
> > >>>      <Document title="2" chapter="2" href="file2.xml" filter="drink">
> > >>>              <Article title="2.1" info="sub" filter="drink"/>
> > >>>              <Article title="2.2" info="main" filter="food"/>
> > >>>      </Document>
> > >>>      <Document title="3" chapter="3" href="file2.xml" filter="">
> > >>>              <Article title="3.1" info="sub" filter="drink"/>
> > >>>              <Article title="3.2" info="child" filter=""/>
> > >>>      </Document>
> > >>></Documents>
> >
> >
> 
> 
> --
> 
> [row.filter]
> 


-- 

[row.filter]

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.