Subject: Re: [xsl] Possible MSXML 3 / 4 bug: using a for-each on xsl:variable / tree-frag is misbehaving From: Joerg Heinicke <joerg.heinicke@xxxxxx> Date: Tue, 14 May 2002 16:41:19 +0200 |
> I thought that each time you execute a "select" that you're dealing with an > RTF, regardless if the "select-or" is an xsl:for-each element or an > xsl:variable element.
Hey Joerg,
Thanks for the quick response, and I'm very please it's the problem was just in my lack of understanding RTFs.
However, why does the second for-each loop (the control loop in my
"experiment") work?
I guess what the second for-each is operating on (it's context) is not an
RTF? If it's not then what is it? What's its object structure?
I thought that each time you execute a "select" that you're dealing with an RTF, regardless if the "select-or" is an xsl:for-each element or an xsl:variable element.
Thanks again, Jeff
-----Original Message----- From: Joerg Heinicke [mailto:joerg.heinicke@xxxxxx] Sent: Tuesday, May 14, 2002 10:08 AM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Subject: Re: [xsl] Possible MSXML 3 / 4 bug: using a for-each on xsl:variable / tre e-frag is misbehaving
Hello Jeff,
sorry, but it isn't a bug. You already said the solution: "given for-each's context". You are switching the context to another XML tree (the RTF) instead of the original document. What you can do is a second for-each inside the first switching the context back to oringial document or simply accessing the original document stored in a variable:
<xsl:variable name="orig" select="/"/>
> <xsl:template match="/"> > <output> > <xsl:variable name="items" > > <xsl:copy-of select="//item"/> > </xsl:variable> > <xsl:for-each select="msxsl:node-set($items)/item"> > <using_msxsl_node-set child-id="{@id}">
> <xsl:copy-of select="$orig/xml/an-element"/> ^^^^^
or
<xsl:for-each select="$orig"> <xsl:copy-of select="/xml/an-element"/> </xsl:for-each>
> </using_msxsl_node-set> > </xsl:for-each> > <xsl:for-each select="//item"> > <NOT_using_msxsl_node-set child-id="{@id}"> > <xsl:copy-of select="/xml/an-element"/> > </NOT_using_msxsl_node-set> > </xsl:for-each> > </output> > </xsl:template> > </xsl:stylesheet>
Regards,
Joerg
Jeff Beadle wrote:
Howdy all,
I looked through the archives and went to Microsoft's msxml site and couldn't find any "PRB" or "BUG" reports regarding this "issue".
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.
Here's the xml:
<?xml version="1.0"?> <xml> <an-element> <child id="child01"/> <child id="child02"/> </an-element> <collection> <item id="item01"/> <item id="item02"/> </collection> </xml>
Here's the xslt:
<?xml version="1.0" ?> <xsl:stylesheet version="1.0" exclude-result-prefixes="msxsl" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="utf-8"/> <xsl:template match="/"> <output> <xsl:variable name="items" > <xsl:copy-of select="//item"/> </xsl:variable> <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> <xsl:for-each select="//item"> <NOT_using_msxsl_node-set child-id="{@id}"> <xsl:copy-of select="/xml/an-element"/> </NOT_using_msxsl_node-set> </xsl:for-each> </output> </xsl:template> </xsl:stylesheet>
Here's the output (I get):
<?xml version="1.0" encoding="utf-8" ?> <output> <using_msxsl_node-set child-id="item01" /> <using_msxsl_node-set child-id="item02" /> <NOT_using_msxsl_node-set child-id="item01"> <an-element> <child id="child01" /> <child id="child02" /> </an-element> </NOT_using_msxsl_node-set> <NOT_using_msxsl_node-set child-id="item02"> <an-element> <child id="child01" /> <child id="child02" /> </an-element> </NOT_using_msxsl_node-set> </output>
If this is not a user error/bug and truly is a bug within msxml, then this one really sucks.
I can think of workarounds but they're a major pain in the you-know-what.
... oh, and for those will immediately ask: "Can you re-design the code
not
to use a variable?" Nope, I can't ... well, I'm pretty sure I can't. Within the real code, I have to build and work with temporary objects/results.
So, has anyone encountered this "issue"?
Thanks, Jeff
System Development VIRBUS AG Fon +49(0)341-979-7419 Fax +49(0)341-979-7409 joerg.heinicke@xxxxxxxxx www.virbus.de
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Possible MSXML 3 / 4 bug:, Jeff Beadle | Thread | Re: [xsl] Possible MSXML 3 / 4 bug:, David Carlisle |
RE: [xsl] Generating an XSL from an, bryan | Date | [xsl] Problem using preceding-sibli, Faroukh Fekravar |
Month |