0

背景:我正在使用 HtmlAgilityPack (.Net),所以我不得不使用 XPath 1.0,它没有小写实现

我正在尝试查找具有包含foo整个单词的属性的所有节点。
例子:

  • “富”匹配
  • “我的 foo”比赛
  • “富吧”匹配
  • “福”匹配
  • "ifoo"不匹配
  • “食物”不匹配

这就是我所拥有的(ends-withXPath 1.0 中也没有......):

//*[@*[starts-with(.,'foo ') or contains(.,' foo ') or .='foo' or substring(.,string-length(.) - 3)=' foo']]

据此,我可以使用这种可怕的方法来小写搜索条件:

translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')

最后,我的问题是:我如何使用该translate函数,同时保持表达式尽可能简短和可读?

(奖励:我如何在不同的表达之间分享这个?)

4

2 回答 2

1

向 XPath 添加自定义函数怎么样?

于 2012-07-29T14:29:08.200 回答
1

只需使用(Tomalak 答案的摘要版本):

//@*[contains(concat(' ', 
                     translate(normalize-space(), 'FOO', 'foo'), 
                     ' '), 
              ' foo '
              )
    ]

警告

切勿将未知代理(最终用户)收到的字符串插入 XPath 表达式占位符。这为XPath 注入攻击打开了一个巨大的漏洞。

推荐的做法是编译 XPath 表达式并在评估完成时将用户提供的字符串作为参数传递(或通过 XPath 表达式中的变量或函数引用获取它们)。

于 2012-07-29T16:07:15.020 回答