.net &引用;“代码重用”;在XPath表达式中
背景:我正在使用HtmlAgilityPack(.Net),所以我不得不使用XPath1.0 我正在尝试查找具有包含.net &引用;“代码重用”;在XPath表达式中,.net,xpath,.net,Xpath,背景:我正在使用HtmlAgilityPack(.Net),所以我不得不使用XPath1.0 我正在尝试查找具有包含foo作为一个完整单词的属性的所有节点。 示例: “福”赛 “我的福”比赛 “富吧”比赛 “福”赛 “ifoo”不匹配 “食物”不是对手 这就是我所拥有的(XPath 1.0中也没有以结尾的): 根据,我可以使用这种可怕的方法来降低搜索条件的大小写: translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuv
foo
作为一个完整单词的属性的所有节点。示例:
- “福”赛
- “我的福”比赛
- “富吧”比赛
- “福”赛
- “ifoo”不匹配
- “食物”不是对手
):
根据,我可以使用这种可怕的方法来降低搜索条件的大小写:
translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')
最后,我的问题是:如何使用translate
函数,同时尽可能保持表达式的简短和可读性?
(奖励:我如何在不同的表达之间分享这个呢?怎么样?只需使用(Tomalak答案的摘要版本):
警告:
切勿在XPath表达式占位符中插入未知代理(最终用户)接收的字符串。这将为打开一个大洞
推荐的做法是使用已编译的XPath表达式,并在完成计算时将用户提供的字符串作为参数传递(或XPath表达式中的。您所说的“如何在不同的表达式之间共享此值”是什么意思?Tomalak很好地回答了其余的问题——使用sentinel方法是编程中众所周知的技术。谢谢——现在好多了。。。我用的是常数,所以我不怕打针(不是‘foo’。@塞尔达里:不客气。我真的建议在上下文中使用编译后的XPath表达式+函数/变量。
translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')
//@*[contains(concat(' ',
translate(normalize-space(), 'FOO', 'foo'),
' '),
' foo '
)
]