RE: [xsl] Trying to figure out the child::item[position()=1] syntax

Subject: RE: [xsl] Trying to figure out the child::item[position()=1] syntax
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 10 Jul 2006 22:02:23 +0100
Your path expression:

menuItems[child::menuItem[position()=1]/pageID = $pageID]

can be simplified to

menuItems[menuItem[1]/pageID = $pageID]

to be a bit more idiomatic.

The path expression selects a set of nodes (probably a set consisting either
of a single menuItems node, or nothing).

When you use the path expression in an xsl:if instruction, the node-set is
converted to a boolean: true if there is at least one node, otherwise false.

When you use the path expression in an xsl:value-of instruction, the
node-set is converted to a string: if the node-set is empty, the result is
""; if the node-set contains a single element, the result is the
string-value of that element, which is the concatenation of all its
descendant text nodes.

Hope that makes it clearer.

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: Austin, Darrel [mailto:Darrel.Austin@xxxxxxxxxxxxxxxxxx] 
> Sent: 10 July 2006 21:52
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Trying to figure out the 
> child::item[position()=1] syntax
> 
> I use XSL sporadically and, as such, haven't quite figured 
> out all the syntax yet.
> 
> Here's a snippet of my XML:
> 
> <menuItems>
>   <menuItem>
>      <pageID>1</pageID>
>   </menuItem>
>   <menuItem>
>      <pageID>2</pageID>
>   </menuItem>
> </menuItems>
> 
> In my XSL, I want to determine if the 'pageID' value of the 
> first menuItem (and ONLY the first menuItem) matches a 
> particular value that I am passing into the XSL file.
> 
> From what I can tell, I need to use the 
> child::item[position()=1] syntax. Is that correct?
> 
> This is what I've come up with:
> 
> <xsl:if test="menuItems[child::menuItem[position()=1]/pageID 
> = $pageID]">
> 
> That seems to work. BUT, what I am a bit confused of is if I 
> write the above as a value-of:
> 
> <xsl:value-of 
> select="menuItems[child::menuItem[position()=1]/pageID = $pageID]"/>
> 
> If the node doesn't exist, I get nothing (I assume a 'false' 
> value in the IF comparison). If it does exist, I get the 
> entire contents of the XML file. Is that normal? I guess my 
> confusion is why does the if statement appear to return a 
> true/false while the value-of statement returns nothing or 
> the entire XML file? 
> 
> -Darrel

Current Thread