The expression substring-before(//foo/foo2, '-') is a valid XPath 1.0
expression.
In XPath 2.0 it is valid only if //foo/foo2 returns a single node. The
Saxon error message implies that it is selecting more than one node. If
you want to select only the first node, use
substring-before((//foo/foo2)[1], '-'). If you want to process all the
nodes (in XPath 2.0) use
for $x in //foo/foo2 return substring-before($x, '-')
Michael Kay
Software AG
home: Michael(_dot_)H(_dot_)Kay(_at_)ntlworld(_dot_)com
work: Michael(_dot_)Kay(_at_)softwareag(_dot_)com
-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of
Monier, Yves
Sent: 07 March 2003 16:46
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Beginning an XPath expression with a function call?
Hello,
Given an XPath expression (for example //foo/foo2) that works
for a given xml, I would like to use the substring-before
function, to keep only the characters in //foo/foo2 before
'-'. The XPath would then become substring-before(//foo/foo2, '-')
It seems that both XPath 1.0 specs, MSXML 4, Saxon 7.4 and
XalanJ 2.5 refuse such construction (e.g. having a function
call as root of an XPath expression). Note that it works with
Xalan C++ 1.4. Should it, or not, regarding the specs?
Do you know if there is a simple "legal" XPath-only-based
solution to achieve the same result?
Many thanks,
Yves
PS:
For MSXML 4 I use an XMLDOMDocument + the selectSingleNode function.
For Saxon and XalanJ I wrote programs derived from their
respective XPathExample and ApplyXPath samples.
For XalanC I wrote a program derived from its XPathWrapper sample).
Saxon error is "A sequence of more than one item is not
allowed here". XalanJ error is "Can not convert #STRING to a
NodeList!".
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list