xsl-list
[Top] [All Lists]

Re: Using preceding-sibling::node()

2004-11-01 12:45:57
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'][(_at_)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'][(_at_)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[(_at_)id = 'archive'][(_at_)id='archive']/timestamp[(_at_)time &lt;= '1099119599'])[last()]

Cheers,
Wendell


======================================================================
Wendell Piez                            
mailto:wapiez(_at_)mulberrytech(_dot_)com
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
======================================================================



<Prev in Thread] Current Thread [Next in Thread>