[xsl] simple XPath question

Subject: [xsl] simple XPath question
From: "Chris Nolte" <nolte@xxxxxxxxxxxxxxx>
Date: Mon, 2 Jul 2001 13:47:29 -0700
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


Current Thread