|
Subject: Re: [xsl] Possible MSXML 3 / 4 bug: using a for-each on xsl:variable / tre e-frag is misbehaving From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Tue, 14 May 2002 15:00:25 +0100 |
Hi Jeff,
> Here's what I'm seeing: Within an xsl:for-each element, where the
> select is made against an xsl:variable tree-frag, xpath statements
> are failing to nodes outside of the given for-each's context.
I think you're seeing correct behaviour here. Within the xsl:for-each:
> <xsl:for-each select="msxsl:node-set($items)/item">
> <using_msxsl_node-set child-id="{@id}">
> <xsl:copy-of select="/xml/an-element"/>
> </using_msxsl_node-set>
> </xsl:for-each>
the current node is an item element within the node set derived from
the $items node set. The path /xml/an-element is resolved relative to
the current node -- the / means the root node of the node tree in
which the item resides.
The $items result tree fragment is generated with:
> <xsl:variable name="items" >
> <xsl:copy-of select="//item"/>
> </xsl:variable>
which means that the result tree fragment is a root node with a number
of item elements as children. The result tree fragment doesn't contain
any xml elements or an-element elements, so it shouldn't surprise you
that it doesn't return anything.
I think that perhaps you're expecting that / always gives you the root
node of the source of the transformation? That's not the case -- it
gives you the root node of the node tree of which the context node is
a part.
So to achieve what you want, store the root node of the source of the
transformation in a (global) variable:
<xsl:variable name="source" select="/" />
and then use that as the basis of your path within the xsl:for-each:
<xsl:for-each select="msxsl:node-set($items)/item">
<using_msxsl_node-set child-id="{@id}">
<xsl:copy-of select="$source/xml/an-element"/>
</using_msxsl_node-set>
</xsl:for-each>
---
In XPath 2.0, there's a new function called input() that returns the
node(s) that invoked the transformation. So in XSLT 2.0, you could do:
<xsl:variable name="items">
<xsl:copy-of select="//item" />
</xsl:variable>
<xsl:for-each select="$items/item">
<using_temporary_tree child-id="{@id}">
<xsl:copy-of select="input()/xml/an-element" />
</using_temporary_tree>
</xsl:for-each>
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Possible MSXML 3 / 4 bug: us, Jeff Beadle | Thread | Re: [xsl] Possible MSXML 3 / 4 bug:, Joerg Heinicke |
| RE: [xsl] XSLT/XPath 2.0 (was "Iden, bryan | Date | Re: [xsl] using Saxon from Tomcat, Robert Koberg |
| Month |