无法使用xpath函数ends-with(),但contains()可以正常工作的问题

24

我试图获取具有某个 id 属性结尾的标签。
例如,<span id="ctl00_ContentPlaceHolder1_Country">
我想获得 id 以 'Country' 结尾的 span 标签。
我尝试使用以下 XPath 表达式://span[ends-with(@id,'Country')] 但是我遇到了以下异常:
"Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function."

奇怪的是,contains 函数却可以正常工作
因此下面的 XPath 表达式就可以正常工作://span[contains(@id,'Country')]
你们有什么想法,为什么会出现这种情况呢?
谢谢。


好问题(+1)。看看我的答案,其中包含一个一行代码的XPath 1.0解决方案,实现了XPath 2.0的ends-with()函数。 :) - Dimitre Novatchev
3个回答

38

函数 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 2.0表达式ends-with(/myXml/data, 'World')的XPath 1.0表达式是:

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

8

contains()和starts-with()是XSLT1中的函数;而ends-with()只在XSLT2中存在。


1
你需要与开发者沟通。这是哪个变压器实现? - Jim Garrison
5
另外,请注意fn:contains不会给您相同的结果。您可以使用:span[substring(@id,string-length(@id)-6)='Country'] - user357812

2

日期: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:返回第一个参数字符串中第一次出现第二个参数字符串之前的子字符串。

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

MSDN源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接