This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: Global location path confusion
- To: <xsl-list at lists dot mulberrytech dot com>
- Subject: RE: [xsl] Global location path confusion
- From: "Michael Kay" <mhkay at iclway dot co dot uk>
- Date: Thu, 22 Feb 2001 23:48:53 -0000
- Reply-To: xsl-list at lists dot mulberrytech dot com
> 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