Subject: Re: [xsl] Frustrated with xxx:node-set From: Karl Stubsjoen <kstubs@xxxxxxxxx> Date: Wed, 1 Jun 2005 15:14:26 -0700 |
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/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Frustrated with xxx:node-, Dimitre Novatchev | Thread | Re: [xsl] Frustrated with xxx:node-, Dimitre Novatchev |
Re: [xsl] Saxon for windows?, Barry Lay | Date | Re: [xsl] Frustrated with xxx:node-, Dimitre Novatchev |
Month |