Re: [xsl] Using preceding-sibling::node()

Subject: Re: [xsl] Using preceding-sibling::node()
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Mon, 01 Nov 2004 14:45:57 -0500
Hi Dilip,

At 02:28 PM 11/1/2004, you wrote:
Hi,

I'm fairly new to XML and I'm trying to modify my query so that it fetches the preceding sibling to
the originally requested node if the originally requested node does not exist.

Sounds fine, up to the point where you say you want the preceding sibling of a node that doesn't exist ... XSLT isn't smart enough to know where in the input a node would be if it existed.


For example:
if my original query was something like
child::data[attribute::id = 'archive'][@id='archive']/child::timestamp[attribute::time = '1099119599']


and if the node with that particular timestamp is not present in the XML document I'd like to modify my query
in such a way that it fetches the node that has a timestamp < 1099119599.


I understand if I change my query to
child::data[attribute::id = 'archive'][@id='archive']/child::timestamp[attribute::time < '1099119599']
then all the nodes with timestamp < 1099119599 get returned

That's correct.


Yet if your nodes are already ordered by time (which assumption is built into your question), you can get the last of this set in document order by grouping the set and using a predicate on the group. The last() function, which returns the size of the group, is designed for use in exactly this kind of situation. Using the query you've constructed (while removing that second, redundant predicate and changing '<' to '<=' in case that exact timestamp exists after all), that would be

(child::data[attribute::id = 'archive']/child::timestamp[attribute::time &lt;= '1099119599'])[position() = last()]

or abbreviating this:

(data[@id = 'archive'][@id='archive']/timestamp[@time &lt;= '1099119599'])[last()]

Cheers,
Wendell


====================================================================== Wendell Piez mailto:wapiez@xxxxxxxxxxxxxxxx Mulberry Technologies, Inc. http://www.mulberrytech.com 17 West Jefferson Street Direct Phone: 301/315-9635 Suite 207 Phone: 301/315-9631 Rockville, MD 20850 Fax: 301/315-8285 ---------------------------------------------------------------------- Mulberry Technologies: A Consultancy Specializing in SGML and XML ======================================================================

Current Thread