获取xpath函数的问题end-with()工作,而contains()工作正常

我正在尝试获取具有以某个id结尾的属性的标记。
喜欢
我希望得到id以“Country”结尾的跨度
我尝试以下xpath //span[ends-with(@id,'Country')]但我得到以下exception
“需要命名空间管理器或XsltContext。此查询具有前缀,变量或用户定义的函数。”

奇怪的是,包含的工作正常,所以下面的xpath工作//span[contains(@id,'Country')]
任何想法为什么会这样? 谢谢

函数 ends-with() 没有为XPath 1.0定义, 但仅适用于XPath 2.0和XQuery 。

您正在使用.NET。 。 这个日期的.NET没有实现 XPath 2.0XSLT 2.0XQuery

可以很容易地构造一个XPath 1.0表达式,其评估产生与函数ends-with()相同的结果:

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

产生相同的布尔结果( true()false() )如下:

ends-with($str1, $str2)

在具体情况下,您只需要为$str1$str2替换正确的表达式。 因此,它们是/myXml/data'World'

因此,要使用的XPath 1.0表达式,相当于XPath 2.0表达式的ends-with(/myXml/data, 'World')

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

contains()和starts-with()在XSLT1中; ends-with()仅在XSLT2中。

日期:2016年1月6日

对于任何阅读此答案的人来说,这些是最新的.Net 4.6框架支持的Xpath字符串函数:

concat :返回参数的串联。

contains :如果第一个参数字符串包含第二个参数字符串,则返回true; 否则返回false。

normalize-space :返回剥离了空格的参数字符串。

starts-with :如果第一个参数字符串以第二个参数字符串开头,则返回true; 否则返回false。

string :将对象转换为字符串。

string-length :返回字符串中的字符数。

substring :返回从第二个参数中指定的位置开始的第一个参数的子字符串以及第三个参数中指定的长度。

substring-after :返回第一个参数字符串的子字符串,该字符串位于第一个参数字符串中第一个出现的第二个参数字符串之后。

substring-before :返回第一个参数字符串的子字符串,该字符串位于第一个参数字符串中第一个第二个参数字符串出现之前。

translate :返回第一个参数字符串,第二个参数字符串中出现的字符替换为第三个参数字符串中相应位置的字符。

MSDN来源