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

时间:2010-08-12 15:22:28

标签: c# xml xpath

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

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

3 个答案:

答案 0 :(得分:29)

该功能 ends-with() 未定义为XPath 1.0 ,仅适用于XPath 2.0XQuery

您正在使用.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
             )

答案 1 :(得分:8)

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

答案 2 :(得分:1)

日期: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 Source