[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
[Recent Entries]
[Reply To This Message]
Re: What's wrong with my ancestor syntax?
Subject: Re: What's wrong with my ancestor syntax?
From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx>
Date: Mon, 26 Mar 2007 23:09:47 +0100
|
On 3/26/07, Austin, Darrel <Darrel.Austin@xxxxxxxxxxxxxxxxxx> wrote:
I'm trying to use ancestor-or-self.
Here's a sample of the XML:
<menuItems>
<menuItem>
<pageID>938</pageID>
<browserTitle>Home Page</browserTitle>
<lastUpdate>2006/06/12</lastUpdate>
<menuItem>
<pageID>998</pageID>
<browserTitle>District Administration</browserTitle>
<lastUpdate>2006/06/06</lastUpdate>
</menuItem>
</menuItem>
<menuItems>
This is the XML that forms our site menu. I want to create an RSS feed
that lists the most recent 10 pages that have been changed under a
certain node of the menu.
So, for this example, I want to pass in the page ID of '938' and return
both '938' and any child page underneath it.
Here's the XSL:
<xsl:param name="pageID">1</xsl:param>
<xsl:template match="/">
<xsl:for-each select="*/menuItem[ancestor-or-self::pageID =
$pageID]">
<xsl:sort select="substring(@lastUpdate,1,4)"
order="descending" /> <!-- year -->
<xsl:sort select="substring(@lastUpdate,6,2)"
order="descending" /> <!-- month -->
<xsl:sort select="substring(@lastUpdate,9,2)"
order="descending" /> <!-- day -->
<xsl:call-template name="createItem" />
</xsl:for-each>
</xsl:template>
<xsl:template name="createItem">
lastUpdate: <xsl:value-of select="lastUpdate"/>
browserTitle: <xsl:value-of select="browserTitle"/>
pageID: <xsl:value-of select="pageID"/>
</xsl:template>
Originally, I had 'descendant-or-self' by mistake which obviously gave
me the exact opposite of what I wanted and returned the specific node
and all PARENT pages that matched. So I changed to ancestor-or-self and
now it doesn't appear to match anything. I'm not sure why. Is my logic a
bit off?
If I've understood what mean, you just need:
<xsl:template match="/">
<xsl:apply-templates select="//menuItem[pageID = $pageID">
<xsl:sort ......./>
and then change the named template to be a match:
<xsl:template match="menuItem">
Also if your dates are yyyy/mm/dd then you can replace your 3 sorts with:
<xsl:sort select="translate(@lastUpdate, '/', '')" data-type="number"/>
cheers
andrew
|
PURCHASE STYLUS STUDIO ONLINE TODAY!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Download The World's Best XML IDE!
Accelerate XML development with our award-winning XML IDE - Download a free trial today!
Subscribe in XML format
RSS 2.0 |
|
Atom 0.3 |
|
|