|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Frustrated with xxx:node-set
Hi Dimitre, thanks for the tips! Just tested your exMSXSL parser with:
exmsxsl foobar.xml get_foobar.xsl -o result.xml -u '4.0*ex'
But seems to have produced the same buggy response as msxm4. Could I
have done something wrong on install? (I dropped the exMsxsl.exe file
in my Window 32 directory -- after running the setup.exe file)
Karl
On 6/1/05, Dimitre Novatchev <dnovatchev@xxxxxxxxx> wrote:
> The result you report is produced when transforming with MSXML4.
>
> MSXML3 and .NET 1.1 XSLTTransform() class produce the correct result.
>
> Interestingly, using the EXSLT for MSXML4 also produces the correct result.
>
> Therefore, I'd recommend that you either switch from MSXML4 to MSXML3 or
.NET1.1
>
> or
> install and use EXSLT for MSXML4 (this will be probably less painfull)
>
> More details about EXSLT for MSXML4 can be found at:
>
> http://www.xml.com/pub/a/2003/08/06/exslt.html
>
>
> Hope this helped.
>
> Cheers,
> Dimitre Novatchev.
>
> On 6/2/05, Karl Stubsjoen <kstubs@xxxxxxxxx> wrote:
> > All right, I did my best to create a "foobar" example. Here it is...
> > but first, let me explain the results produced: You'll find 2 sets of
> > <foobar_summary> elements; this corresponds to the number <A> elements
> > in your source. Within this element there is a <summary_for_foo> and
> > <summary_for_bar> element. In the 2nd set of <foobar_summary> the
> > <summary_for_foo> is empty and this is the point of failure.
> > See below:
> > <summary_for_foo></summary_for_foo><!-- POINT OF FAILURE -->
> > There is no reason that this set is emtpy, this is a quirk in the
> > parser. Notice that the next set <summary_for_bar> correctly
> > summarizes the colors; it's as if the parser loses touch with reality
> > and then rediscovers it.
> > If you take away an A element so you just have one, the summary
> > appears to work fine. If you add multiple A elements you'll continue
> > to see the "miss-behaviour"...
> > Included, source xml; stylesheet; results (as produced parsing with
MSXML4):
> >
> > SOURCE XML:
> > <?xml version="1.0"?>
> > <FOOBAR>
> > <A>
> > <B code="FOO">red</B>
> > <B code="BAR">green</B>
> > <B code="FOO">blue</B>
> > <B code="BAR">red</B>
> > <B code="FOO">blue</B>
> > <B code="BAR">green</B>
> > <B code="BAR">green</B>
> > <B code="FOO">green</B>
> > <B code="BAR">blue</B>
> > </A>
> > <A>
> > <B code="FOO">green</B>
> > <B code="BAR">green</B>
> > <B code="FOO">blue</B>
> > <B code="BAR">green</B>
> > <B code="FOO">red</B>
> > <B code="BAR">green</B>
> > <B code="FOO">green</B>
> > <B code="FOO">green</B>
> > <B code="BAR">blue</B>
> > <B code="FOO">green</B>
> > <B code="FOO">green</B>
> > <B code="BAR">blue</B>
> > </A>
> > </FOOBAR>
> >
> > STYLESHEET ==============
> > <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> > xmlns:fx="urn:schemas-microsoft-com:xslt">
> >
> > <xsl:key name="foobar" match="B" use="."/>
> >
> > <xsl:template match="/">
> > <result>
> > <xsl:apply-templates select="FOOBAR/A"/>
> > </result>
> > </xsl:template>
> >
> > <xsl:template match="A">
> > <xsl:variable name="foo">
> > <foo>
> > <xsl:apply-templates select="B[@code='FOO']" mode="indentity_copy"/>
> > </foo>
> > </xsl:variable>
> >
> > <xsl:variable name="bar">
> > <bar>
> > <xsl:apply-templates select="B[@code='BAR']" mode="indentity_copy"/>
> > </bar>
> > </xsl:variable>
> >
> > <!-- what we are working on -->
> > <xsl:copy-of select="fx:node-set($foo)"/>
> > <xsl:copy-of select="fx:node-set($bar)"/>
> >
> > <!-- summary results foo -->
> > <foobar_summary>
> > <summary_for_foo>
> > <xsl:apply-templates select="fx:node-set($foo)" mode="summary"/>
> > </summary_for_foo>
> >
> > <!-- summary results bar -->
> > <summary_for_bar>
> > <xsl:apply-templates select="fx:node-set($bar)" mode="summary"/>
> > </summary_for_bar>
> > </foobar_summary>
> > </xsl:template>
> >
> > <xsl:template match="B" mode="indentity_copy">
> > <xsl:copy-of select="."/>
> > </xsl:template>
> >
> > <!-- summary -->
> > <xsl:template match="foo | bar" mode="summary">
> > <xsl:apply-templates select="B[generate-id(.) =
> > generate-id(key('foobar',.)[1])]" mode="summary"/>
> > </xsl:template>
> >
> > <xsl:template match="B" mode="summary">
> > <xsl:variable name="color" select="."/>
> > <summary>
> > <xsl:attribute name="code"><xsl:value-of select="@code"/></xsl:attribute>
> > <xsl:attribute name="color"><xsl:value-of
select="$color"/></xsl:attribute>
> > <xsl:value-of select="count(../B[.=$color])"/>
> > </summary>
> > </xsl:template>
> >
> >
> > </xsl:stylesheet>
> >
> > RESULT =================
> > <?xml version="1.0" encoding="UTF-16" ?>
> > <result xmlns:fx="urn:schemas-microsoft-com:xslt">
> > <foo>
> > <B code="FOO">red</B>
> > <B code="FOO">blue</B>
> > <B code="FOO">blue</B>
> > <B code="FOO">green</B>
> > </foo>
> > <bar>
> > <B code="BAR">green</B>
> > <B code="BAR">red</B>
> > <B code="BAR">green</B>
> > <B code="BAR">green</B>
> > <B code="BAR">blue</B>
> > </bar>
> > <foobar_summary>
> > <summary_for_foo>
> > <summary code="FOO" color="red">1</summary>
> > <summary code="FOO" color="blue">2</summary>
> > <summary code="FOO" color="green">1</summary>
> > </summary_for_foo>
> > <summary_for_bar>
> > <summary code="BAR" color="green">3</summary>
> > <summary code="BAR" color="red">1</summary>
> > <summary code="BAR" color="blue">1</summary>
> > </summary_for_bar>
> > </foobar_summary>
> > <foo>
> > <B code="FOO">green</B>
> > <B code="FOO">blue</B>
> > <B code="FOO">red</B>
> > <B code="FOO">green</B>
> > <B code="FOO">green</B>
> > <B code="FOO">green</B>
> > <B code="FOO">green</B>
> > </foo>
> > <bar>
> > <B code="BAR">green</B>
> > <B code="BAR">green</B>
> > <B code="BAR">green</B>
> > <B code="BAR">blue</B>
> > <B code="BAR">blue</B>
> > </bar>
> > <foobar_summary>
> > <summary_for_foo></summary_for_foo><!-- POINT OF FAILURE -->
> > <summary_for_bar>
> > <summary code="BAR" color="green">3</summary>
> > <summary code="BAR" color="blue">2</summary>
> > </summary_for_bar>
> > </foobar_summary>
> > </result>
> >
> > On 6/1/05, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> > > >
> > > > I want to strike up conversation/thread about the xxx:node-set, if
> > > > anyone interested. I am very frustrated with the lack of consistent
> > > > performance I have witnessed using the xxx:node-set function with
> > > > MSXML4 Parser.
> > > >
> > >
> > > You haven't shown us any code or any performance measurements, so it's
> > > difficult to make any comments. If you provided sample code and
measurement
> > > data then people could see how other products compared, or tell you how
to
> > > improve your code.
> > >
> > > There are at least two possible implementation strategies for result
tree
> > > fragments and xx:node-set() in XSLT 1.0: one is to build the RTF as a
> > > regular tree, in which case xx:node-set() essentially costs nothing;
the
> > > other is to use some other internal structure for an RTF, in which case
> > > xx:node-set() might be quite expensive. I've no idea which strategy
MSXML
> > > uses, but your measurements might help to shed some light, if they are
> > > carefully made.
> > >
> > > Intrinsically, building trees with any product is likely to be an
expensive
> > > operation. That's one reason that XSLT 2.0 sequences are so useful,
because
> > > they involve less overhead.
> > >
> > > Michael Kay
> > > http://www.saxonica.com/
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








