【问题标题】:problem getting xpath function ends-with() to work while contains() works fine在 contains() 工作正常的情况下,让 xpath 函数 ends-with() 工作的问题
【发布时间】:2010-08-12 15:22:28
【问题描述】:

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

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

【问题讨论】:

  • 好问题 (+1)。请参阅我对实现 XPath 2.0 ends-with() 函数的单线 XPath 1.0 解决方案的回答。 :)

标签: c# xml xpath


【解决方案1】:

函数 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
             )

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您必须与开发人员协商。这是哪个转换器实现?
    • 另外,请注意fn:contains 不会给您相同的结果。您可以使用:span[substring(@id,string-length(@id)-6)='Country']
    【解决方案3】:

    日期:2016 年 1 月 6 日

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

    concat:返回参数的串联。

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

    normalize-space:返回去掉空格的参数字符串。

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

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

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

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

    substring-after:返回第一个参数字符串在第一个参数字符串中第一次出现第二个参数字符串之后的子字符串。

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

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

    MSDN Source

    【讨论】:

      猜你喜欢
      • 2020-09-06
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多