RE: [xsl] Document Function Befuddlement

Subject: RE: [xsl] Document Function Befuddlement
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 10 Jan 2008 17:36:32 -0000
Looks suspiciously like a bug in the processor to me. Try running a
different XSLT processor to see if you get the same results.

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

> -----Original Message-----
> From: Signature House [mailto:systems@xxxxxxxxxxxxxxxxxx] 
> Sent: 10 January 2008 16:57
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Document Function Befuddlement
> 
> Document Function Befuddlement
> 
> I'm working on an application where I have to periodically 
> run a number of xml files that I'm given through the same xsl 
> transform.
> Conveniently, I also get another xml file that lists the 
> names of all of the data files, so this seemed like the 
> perfect chance to put the document function to good use (my 
> first time).
> 
> I'm on a PC running XP SP2, using IE 7 & xsl 1.0. Below I've 
> included a much reduced test process that I've been using to 
> get it working - it simply lists the position, name and value 
> of all element nodes.
> 
> 'day1.xml' & 'day2.xml' are the data files, 'monthly 
> list.xml' is the list of file names and I use 'list 
> nodes.xml' to trigger the whole thing by loading it into IE.
> 
> My befuddlement comes in because I'm getting more output from 
> a more restrictive selection criteria than I am from a less 
> restrictive selection criteria.
> 
> 
> If, in 'monthly process.xsl', I use
> 
> <xsl:for-each select="document($monthly_link/@link)/daily//*">
> 
> I get, correctly:
> 
> Pos Name     Value
> --- ----     -----
> 1   client
> 2   day      1
> 3   name     John
> 4   client
> 5   day      2
> 6   name     Margaret
> 
> 
> However, this doesn't show the daily nodes, which I wanted 
> included also, so I tried:
> 
> <xsl:for-each select="document($monthly_link/@link)//*">
> 
> I get, unexpectedly:
> 
> Pos Name     Value
> --- ----     -----
> 1   daily
> 2   client
> 3   day      1
> 4   name     John
> 
> 
> What I expected (and wanted) from the use of //* is:
> 
> Pos Name     Value
> --- ----     -----
> 1   daily
> 2   client
> 3   day      1
> 4   name     John
> 5   daily
> 6   client
> 7   day      2
> 8   name     Margaret
> 
> 
> Would someone please explain why this is happening and what I 
> should do to get the results I need?
> 
> Thanks in advance
> 
> Mike McBee
> Signature House
> 
> 
> 
> 
> monthly process.xsl
> -------------------
> <?xml version="1.0"?>
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> <xsl:template match="/">
>  <table border="1">
>   <xsl:variable name="monthly_link" select="document('monthly 
> list.xml')/monthly/day"/>
>   <tr><td>Pos</td><td>Name</td><td>Value</td></tr>
>   <xsl:for-each select="SEE ABOVE">
>    <tr>
>     <td><xsl:number value="position()" format="1"/></td>
>     <td><xsl:value-of select="name(self::node())"/></td>
>     <td><xsl:value-of select="normalize-space(text())"/></td>
>    </tr>
>   </xsl:for-each>
>  </table>
> </xsl:template>
> </xsl:stylesheet>
> 
> 
> list nodes.xml
> --------------
> <?xml version="1.0"?>
> <?xml-stylesheet type="text/xsl" href="monthly process.xsl"?> 
> <null>null</null>
> 
> 
> monthly list.xml
> ----------------
> <?xml version="1.0"?>
> <monthly>
>  <day link="day1.xml"/>
>  <day link="day2.xml"/>
> </monthly>
> 
> 
> day1.xml
> --------
> <?xml version="1.0"?>
> <daily>
>  <client>
>   <day>1</day>
>   <name>John</name>
>  </client>
> </daily>
> 
> 
> day2.xml
> --------
> <?xml version="1.0"?>
> <daily>
>  <client>
>   <day>2</day>
>   <name>Margaret</name>
>  </client>
> </daily>

Current Thread