xsl-list
[Top] [All Lists]

Re: Beginning an XPath expression with a function call?

2003-03-07 10:40:32
Monier, Yves wrote:

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?

It's perfectly valid XPath expression, but it cannot be used with / and // operators, because they explicitly require the expression to evaluate a nodeset: "The / and // operators compose an expression and a relative location path. It is an error if the expression does not evaluate to a node-set."
http://www.w3.org/TR/xpath#node-sets
And of course it cannot be used with xsl:apply-templates or xsl:for-each or msxsl's selectNodes, because they all require nodeset as result of the expression's evaluation.

Do you know if there is a simple "legal" XPath-only-based solution to
achieve the same result?
You can use function call as first part of of the path expression, day-to-day example is document('foo.xml')/*//bar like expressions or $foo/bar expressions. What are you trying to achieve actually? substring-before(//foo/foo2, '-') is ok, have you tried
<xsl:value-of select="substring-before(//foo/foo2, '-')"/>
--
Oleg Tkachenko
Multiconn Technologies, Israel


XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>