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

Subject: RE: [xsl] Possible MSXML 3 / 4 bug: using a for-each on xsl:vari able / tre e-frag is misbehaving
From: Jeff Beadle <Jbeadle@xxxxxxxx>
Date: Tue, 14 May 2002 10:19:26 -0400
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


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

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


Current Thread