RE: [xsl] XPath behaviour

Subject: RE: [xsl] XPath behaviour
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 28 Dec 2006 22:54:12 -0000
XPath 2.0 allows a parenthesized expression to appear as a step in a path
expression; XPath 1.0 does not.

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: Lars Rvnnbdck [mailto:lars@xxxxxxxxxxx]
> Sent: 28 December 2006 02:11
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] XPath behaviour
>
> Dear list,
>
> I am having a problem with an XPath expression. The program I
> am using is Stylus Studio 2007 and I am building an XSLT 1.0
> stylesheet. Within the program you have access to an XPath
> Query Editor. I used that together with an XML file to build
> the following:
>
> /calendar/year/month/day[@month = 3 and index =
> 21]/(.|following::day)[@phase =
> 2][1]/(.|following::day)[@weekday = 6][1]
>
> This path will correctly find easter when I execute it in the
> query editor. However, if I create a simple stylesheet that
> uses the path in a <xsl:value-of select="..."> I get a
> compilation error.
>
> Using the built-in processor I get the message:
> Testing.xsl (5, 2): Expected node test in value-of
>
> Using MSXML6 I get the message:
> NodeTest expected here.
>
> /calendar/year/month/day[@month = 3 and index =
> 21]/-->(<--.|following::day)[@phase =
> 2][1]/(.|following::day)[@weekday = 6][1]
>
> Using Saxon 6.5.5 I get the message:
> com.icl.saxon.expr.XPathException: Error in expression
> /calendar/year/month/day[@month = 3 and index =
> 21]/(.|following::day)[@phase =
> 2][1]/(.|following::day)[@weekday = 6][1]:
> Unexpected token [(] in path expression
>
> Using the .NET XslTransform I get the message:
> System.Xml.Xsl.XsltException:
> '/calendar/year/month/day[@month = 3 and index =
> 21]/(.|following::day)[@phase =
> 2][1]/(.|following::day)[@weekday = 6][1]' is an invalid
> XPath expression. --->
> System.Xml.XPath.XPathException: Expression must evaluate to
> a node-set.
>
> From this I gather that it doesn't like the parenthesis.
> However, if I remove them I do not get the desired behaviour.
> Instead, three days are matched and none of them correctly.
>
> How am I supposed to group the union in such a way that I can
> apply the subset rules (within brackets) to it? It would also
> be interesting to know why this works in the query editor,
> but none of the processors.
>
> Any help is appreciated,
> Regards,
> Lars Rvnnbdck

Current Thread