Re: [xsl] Possible MSXML 3 / 4 bug: using a for-each on xsl:variable / tre e-frag is misbehaving

Subject: Re: [xsl] Possible MSXML 3 / 4 bug: using a for-each on xsl:variable / tre e-frag is misbehaving
From: Joerg Heinicke <joerg.heinicke@xxxxxx>
Date: Tue, 14 May 2002 16:07:45 +0200
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


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



Current Thread