RE: [xsl] Global location path confusion

Subject: RE: [xsl] Global location path confusion
From: "Michael Kay" <mhkay@xxxxxxxxxxxx>
Date: Thu, 22 Feb 2001 23:48:53 -0000
> I have the following XSLT stylesheet:
>
> <?xml version="1.0" encoding="iso-8859-1"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> version="1.0">
>
>   <xsl:template match="doc">
>    <doc>
>      <xsl:apply-templates/>
>    </doc>
>   </xsl:template>
>
>   <xsl:template match="a">
>    <x title="{/doc/@title}"/>
>   </xsl:template>
>
>   <xsl:template match="b">
>    <xsl:param name="content">
>      <a/>
>    </xsl:param>
>    <xsl:apply-templates select="$content"/>
>   </xsl:template>
>
> </xsl:stylesheet>
>
Note, this will only work with an XSLT 1.1 processor that allows implicit
conversion of result-tree-fragments to node-sets. (Eg. recent releases of
Saxon).

> Then I feed it the following xml:
>
> <?xml version="1.0" encoding="iso-8859-1"?>
>
> <doc title="abc">
>   <a/>
>   <b/>
> </doc>
>
> This results in the following output xml:
>
> <doc>
>   <x title="abc"></x>
>   <x title=""></x>
> </doc>
>

When you process the second <a/> node, the template rule looks for the title
attribute of the doc element that is a child of the root of the tree
containing the <a/> node, and there isn't one.

It's a common misunderstanding, exacerbated by the terminology of the spec,
that "/doc/x" is an "absolute" location path (or "global" in your words). It
isn't: it's relative to the root of the tree that contains the context node.

Mike Kay


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


Current Thread