Re: [xsl] simple XPath question

Subject: Re: [xsl] simple XPath question
From: James Melton <james.melton@xxxxxxxxxxx>
Date: Mon, 02 Jul 2001 18:00:43 -0400
The match='country[1]' will match any country which is the first country
node of its parent. Both "country" elements are the first "country"
elements of their parent "item" nodes, so both are output inside a
"first-country" element. If you were to add another "country" node
inside of either "item" node you would see that it is not wrapped in a
"first-country" element.

As another bizarre bit, I tested this by adding a country after the "US"
country, and left in your <xsl:copy-of select='position()'/> code. I
found that the number displayed corresponds to the number of countries,
and not the number of "first" countries; i.e. with this input:
<?xml version='1.0'?>
<warehouse>
  <item>
    <name>orange</name>
    <country>US</country>
    <country>UK</country>
  </item>
  <item>
    <name>ice wine</name>
    <country>Canada</country><country>UK</country>
  </item>
</warehouse>


I get this output:
<?xml version="1.0" encoding="UTF-8"?>
<storage>
<first-country>1<country>US</country>
</first-country>
<country>UK</country>
<first-country>3<country>Canada</country>
</first-country>
<country>UK</country>
</storage>


I wonder if you get the same thing with Saxxon - I'm using xalan-j 2.0.

Jim.



Chris Nolte wrote:
> 
> I am trying to work through an example in Khun Yee Fung's XSLT book.  It is
> not giving me the solution he claims it should, but I do not understand why
> not.
> 
> Here is the sample XML:
> <?xml version='1.0'?>
> <warehouse>
>   <item>
>     <name>orange</name>
>     <country>US</country>
>   </item>
>   <item>
>     <name>ice wine</name>
>     <country>Canada</country>
>   </item>
> </warehouse>
> 
> And here is the stylesheet:
> <?xml version='1.0'?>
> <xsl:stylesheet version='1.0'
>   xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
>   <xsl:output method='xml' indent='yes'/>
> 
> <xsl:template match='/'>
>   <xsl:apply-templates/>
> </xsl:template>
> 
> <xsl:template match='warehouse'>
>   <storage>
>     <xsl:apply-templates select='item/country'/>
>   </storage>
> </xsl:template>
> 
> <xsl:template match='country'>
>   <xsl:copy-of select='.'/>
> </xsl:template>
> 
> <xsl:template match='country[1]'>
>   <first-country>
>     <xsl:copy-of select='.'/>
>   </first-country>
> </xsl:template>
> 
> </xsl:stylesheet>
> 
> The output I am getting [using Saxon] is:
> <?xml version="1.0" encoding="utf-8"?>
> <storage>
>    <first-country>
>       <country>US</country>
>    </first-country>
>    <first-country>
>       <country>Canada</country>
>    </first-country>
> </storage>
> 
> i.e., the first-country template is getting matched both times, even though
> the XPath expression uses country[1].  What seems strange to me is that when
> I include the line <xsl:copy-of select='position()'/> at the beginning of
> the template matching country[1], I get a 1 and a 2.
> 
> I believe I am supposed to get:
> <storage>
> <first-country>
>   <country>US</country>
> </first-country>
> <country>Canada</country>
> </storage>
> 
> Am I doing something wrong, or is the example in Fung's book (Chapter 6, p.
> 149) wrong?  How should the stylesheet be structured to get the intended
> output?
> 
> Chris
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

-- 

____________________________________________________________
James Melton                 CyLogix
609.750.5190                 609.750.5100
james.melton@xxxxxxxxxxx     www.cylogix.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread