This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: display parts of XML tree with xsl:copy ?
Thanks a lot for your quick and helpful support.
There is just one question left.
In the moment I get all the volume and number elements incl. text()
even if they issue elem they belong to does not contain any article that
fullfils my condition.
See:
<issue>
<volume>17</volume>
<number>1</number> <-------------------- this whole <issue> should
not be in output
<articles />
</issue>
<issue>
<volume>17</volume>
<number>2</number>
<articles>
<article>
<title>Defining Data Types in a Database Language - A Proposal for
Adding Date and Time Support to SQL.</title>
<initPage>53</initPage>
<endPage>76</endPage>
<authors>
<author position="00">C. J. Date</author>
</authors>
</article>
</articles>
</issue>
<issue>
...
---
How can I controll that only those ancestors are copied that are in an valid
articles supertree?
----- Original Message -----
From: "Jeni Tennison" <jeni@jenitennison.com>
To: "Robert Sösemann" <robert.soesemann@web.de>
Cc: <XSL-List@lists.mulberrytech.com>
Sent: Tuesday, February 26, 2002 12:09 PM
Subject: Re: [xsl] display parts of XML tree with xsl:copy ?
> Hi Robert,
>
> > From the following article DB (SigmodRecord) i want to e.g. only
> > articles by a certain author but the result tree should still
> > contain the information of <number> which is nearer to the root.
>
> The way I'd approach this kind of filtering problem is to create a
> basic stylesheet that performs the identity transformation (copies
> whatever you get in the source) as follows:
>
> <xsl:transform version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <!-- identity template -->
> <xsl:template match="node()|@*">
> <xsl:copy>
> <xsl:apply-templates select="@*|node()" />
> </xsl:copy>
> </xsl:template>
>
> </xsl:transform>
>
> Then, to that identity transform you can add templates that filter out
> portions of the source document. For example, to get basically the
> same thing as the source document, but only include articles that have
> Karen Botnich as an author, I'd use:
>
> <xsl:transform version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <!-- identity template -->
> <xsl:template match="node()|@*">
> <xsl:copy>
> <xsl:apply-templates select="@*|node()" />
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="articles">
> <articles>
> <xsl:apply-templates
> select="article[authors/author = 'Karen Botnich']" />
> </articles>
> </xsl:template>
>
> </xsl:transform>
>
> Since you want to copy the whole of such articles, you could use
> xsl:copy-of instead:
>
> <xsl:template match="articles">
> <articles>
> <xsl:copy-of
> select="article[authors/author = 'Karen Botnich']" />
> </articles>
> </xsl:template>
>
> That's likely to be slightly faster.
>
> If you're more comfortable with a pull method, you could use the
> stylesheet instead:
>
> <xsl:transform version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
> <xsl:template match="/">
> <issues>
> <xsl:for-each select="/issues/issue">
> <issue>
> <xsl:copy-of select="volume | number" />
> <articles>
> <xsl:copy-of
> select="articles/article[authors/author = 'Karen Botnich']" />
> </articles>
> </issue>
> </xsl:for-each>
> </issues>
> </xsl:template>
>
> </xsl:transform>
>
>
> Cheers,
>
> Jeni
>
> ---
> Jeni Tennison
> http://www.jenitennison.com/
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list