tags:

views:

36

answers:

2

hi
i am trying to get the tags that have an attribute that end with a certain id.
like <span id="ctl00_ContentPlaceHolder1_Country">
i want to get the spans that have the id ends with 'Country'
i try the following xpath //span[ends-with(@id,'Country')] but i get the following exception
"Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function."

the strange thing is that contains works fine so the following xpath works //span[contains(@id,'Country')]
any ideas why this happens? thanks

+2  A: 

contains() and starts-with() are in XSLT1; ends-with() is in XSLT2 only.

Jim Garrison
thanks , but why the error messsage is so stupid?
Karim
You'd have to take that up with the developer. Which transformer implementation is this?
Jim Garrison
Also, notice that `fn:contains` wont give you the same results. You could use: `span[substring(@id,string-length(@id)-6)='Country']`
Alejandro
this is .net code
Karim
+1  A: 

The function ends-with() is not defined for XPath 1.0 *but only for XPath 2.0 and XQuery.*

You are using .NET. .NET at this date does not implement XPath 2.0, XSLT 2.0 or XQuery.

One can easily construct an XPath 1.0 expression, the evaluation of which produces the same result as the function ends-with():

$str2 = substring($str1, string-length($str1)- string-length($str2) +1)

produces the same boolean result (true() or false()) as:

ends-with($str1, $str2)

In your concrete case you just need to substitute the right expressions for $str1 and $str2. They are, accordingly, /myXml/data and 'World'.

So, the XPath 1.0 expression to use, that is equivalent to the XPath 2.0 expression ends-with(/myXml/data, 'World') is:

'World' = 
   substring(/myXml/data,
             string-length(/myXml/data) - string-length('World') +1
             )
Dimitre Novatchev