Re: [xsl] Beginning an XPath expression with a function call?

Subject: Re: [xsl] Beginning an XPath expression with a function call?
From: Oleg Tkachenko <olegt@xxxxxxxxxxxxx>
Date: Fri, 07 Mar 2003 19:40:32 +0200
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



Current Thread