我无法弄清楚如何使用XPATH搜索包含单引号的文本.
例如,我在这个问题的标题中添加了引号.以下行
$x("//*[text()='XQuery looking for text with 'single' quote']")
Run Code Online (Sandbox Code Playgroud)
返回一个空数组.
但是,如果我尝试以下内容
$x("//*[text()=\"XQuery looking for text with 'single' quote\"]")
Run Code Online (Sandbox Code Playgroud)
它确实返回页面标题的链接,但我希望能够接受单引号和双引号,所以我不能只为单/双引号定制它.
您可以在此页面上的chrome或firebug控制台中尝试它.
Jua*_*des 13
这是一个hackaround(感谢Dimitre Novatchev),它允许我搜索xpath中的任何文本,无论它是否包含单引号或双引号.在JS中实现,但可以很容易地翻译成其他语言
function cleanStringForXpath(str) {
var parts = str.match(/[^'"]+|['"]/g);
parts = parts.map(function(part){
if (part === "'") {
return '"\'"'; // output "'"
}
if (part === '"') {
return "'\"'"; // output '"'
}
return "'" + part + "'";
});
return "concat(" + parts.join(",") + ")";
}
Run Code Online (Sandbox Code Playgroud)
如果我正在寻找,I'm reading "Harry Potter"我可以做以下事情
var xpathString = cleanStringForXpath( "I'm reading \"Harry Potter\"" );
$x("//*[text()="+ xpathString +"]");
// The xpath created becomes
// //*[text()=concat('I',"'",'m reading ','"','Harry Potter','"')]
Run Code Online (Sandbox Code Playgroud)
这是一个(更短的)Java版本.如果删除类型信息,它与JavaScript完全相同.感谢/sf/users/129542661/
String escapedText = "concat('"+originalText.replace("'", "', \"'\", '") + "', '')";!
Run Code Online (Sandbox Code Playgroud)
在XPath 2.0和XQuery 1.0中,字符串文字的分隔符可以通过加倍来包含在字符串文字中:
let $a := "He said ""I won't"""
Run Code Online (Sandbox Code Playgroud)
要么
let $a := 'He said "I can''t"'
Run Code Online (Sandbox Code Playgroud)
该约定借鉴了SQL.
这是一个例子:
/*/*[contains(., "'") and contains(., '"') ]/text()
Run Code Online (Sandbox Code Playgroud)
将此XPath表达式应用于以下XML文档时:
<text>
<t>I'm reading "Harry Potter"</t>
<t>I am reading "Harry Potter"</t>
<t>I am reading 'Harry Potter'</t>
</text>
Run Code Online (Sandbox Code Playgroud)
选择了想要的正确结果(单个文本节点):
I'm reading "Harry Potter"
Run Code Online (Sandbox Code Playgroud)
这是使用XPath Visualizer进行的验证(我在12年前创建的免费开源工具,它已经教会了XPath成千上万人的有趣方式):

您的问题可能是您无法将此XPath表达式指定为您正在使用的编程语言中的字符串 - 这不是XPath问题,而是您对编程语言的了解的问题.