我已经研究过但似乎没什么用。假设我想要一个带有“Tony's Computer”文本的xpath。我无法做到以下几点:
//*[contains(text(), 'Tony's Computer')]
由于显而易见的原因,因为'在y和s之间取消引用文本。但这也不奏效:
//*[contains(text(), 'Tony\'s Computer')]
也
//*[contains(text(), 'Tony''s Computer')]
有没有办法逃避撇号?我找不到任何东西。我能做的最好的是以下Java(假设 textToLookFor 有要查找的文本):
String[] fields = textToLookFor.split("'");
String textx = "";
for (int indx = 0; indx < fields.length; indx++) {
String stext = fields[indx];
String cont = "contains(text(),'" + stext + "') ";
if (!textx.isEmpty()) {
textx += " and ";
}
textx += cont;
}
String xpath = "//*[" + textx + "]";
基本上做了
//*[contains(text(),'Tony') and contains(text(), 's Computer')]
这是我认为足够好的。但是,它并不完全匹配。例如,它可以找到“托尼和鲍勃的计算机”。
有没有其他人成功做到这一点?我找不到任何其他解决方案。 顺便说一句,当我找到元素时,我可以说String displayed = ele.getText();然后检查shown.contains(textToLookFor)。
在这种情况下,我首先需要做一个 textToLookFor = textToLookFor.replaceAll(“\”“,”\\\“”); ,它会转义任何双引号。
答案 0 :(得分:1)
我假设您使用的是XPath 1.0。您是否尝试在XPath中使用实体'
?
//*[contains(text(), 'Tony's Computer')]
加倍单撇号应该适用于XSLT 2.0。所以,另一个选择是使用Saxon as your XPath engine,然后使用XPath 2.0,然后以下工作:
//*[contains(text(), 'Tony''s Computer')]
答案 1 :(得分:1)
//*[contains(.,"Tony's Computer")]
适合我。在字符串外部使用双引号。
答案 2 :(得分:1)
首先,这取决于您的宿主语言(在您的情况下是Java,对于许多其他人XSLT),因为您不仅要考虑哪些字符在XPath中是特殊的,而且在您的宿主语言中是特殊的。一般规则是,编写满足XPath规则的表达式,然后使用宿主语言转义来满足宿主语言规则(例如,Java中的 Error in t.test(y[x == 1], y[x == 0]) :
promise already under evaluation: recursive default argument reference or earlier problems?
变为"
。主机语言转义不会帮助您超越XPath规则,因为当XPath看到字符串时,主机语言转义已经消失。
XPath允许您使用\"
或'
作为字符串分隔符,因此如果字符串中只出现其中一个字符,则可以使用另一个作为分隔符:{{1} }或"
。对于其中任何一个,如果您使用的是Java,则可以将"Tony's Computer"
替换为'He said "boo!"'
(如果您使用的是XSLT,则将"
替换为\"
)。
XPath 2.0还允许您通过加倍使用字符串文字中的分隔引用,如果您需要在同一字符串中使用两种引用,这很有用:"
或"
(再次然后,您必须添加Java级别的转义。)这在1.0中是不可能的,但您可以使用"He said, ""I can't"""
:'He said, "I can''t"'
来解决这个问题。