Subject: RE: [xsl] Boolean Short Curcuit From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 23 Sep 2005 10:06:27 +0100 |
Well, this could happen because ancestor::page:error/@name exists, but doesn't match the name of any document($form-uri)/form/field... The XPath 2.0 spec says that with an expression (A and B), you've got no guarantee that B won't be called if A is false. That's different from 1.0, and it's designed to allow optimization of joins. In fact Saxon will generally evaluate A first, except in some join predicates: for example for $i in 1 to 10 for $j in 1 to 10 where ($j gt 5 and $i gt 3) return x might be rewritten as for $i in 1 to 10[. gt 3] for $j in 1 to 10[. gt 5] return x So the message is: you shouldn't be relying on order of evaluation; but in this case, I don't think that's likely to be the cause of the problem. The way to avoid reliance on order of evaluation is to rewrite (A and B) as (if (A) then B else false()). Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Alan [mailto:alan-xsl-list@xxxxxxxxx] > Sent: 23 September 2005 09:51 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Boolean Short Curcuit > > In Saxon 8.(4|5). > > I'm calling this function. > > <xsl:function name="page:field" as="element()"> > <xsl:param name="name" as="xs:string"/> > <xsl:sequence select="document($form-uri)/form/field[name = > $name][1]"/> > </xsl:function> > > During this template match. Note that I'm performing a test to see > if the parameter exists. I expect that when it doesn't exist, the > function part of the test will not be called. > > <xsl:template > match="page:message[ancestor::page:error[@name] > and page:field(ancestor::page:error/@name)/error]" > mode="page:page"> > <page:message><xsl:value-of > > select="page:field(ancestor::page:error/@name)/error"/></page:message> > </xsl:template> > > But it appears to be getting called. > > Recoverable error of : > XPTY0004: An error occurred matching pattern > {page:message[ancestor::page:error[@name] and > page:field(ancestor::page:error/@name)/error]} > : An empty sequence is not allowed as the result of > function page:field() > > I can provide more context if necessary. I tried if/else statements > in the call to page:field, but that still produced the error. > > Thanks. > > -- > Alan Gutierrez - alan@xxxxxxxxx > - http://engrm.com/blogometer/index.html > - http://engrm.com/blogometer/rss.2.0.xml
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Boolean Short Curcuit, Alan | Thread | Re: [xsl] Boolean Short Curcuit, David Carlisle |
Re: [xsl] start-stopping xml output, Mukul Gandhi | Date | RE: [xsl] resolving namespace for a, Michael Kay |
Month |