XQuery使用'单个'引用

时间:2012-11-20 21:20:53

标签: xpath escaping

我无法弄清楚如何使用XPATH搜索包含单引号的文本。

例如,我在这个问题的标题中添加了引号。以下一行

$x("//*[text()='XQuery looking for text with 'single' quote']")

返回一个空数组。

但是,如果我尝试以下

$x("//*[text()=\"XQuery looking for text with 'single' quote\"]")

它确实返回了页面标题的链接,但我希望能够接受单引号和双引号,所以我不能只为单/双引号定制它。

您可以在此页面的chrome或firebug控制台中试用它。

6 个答案:

答案 0 :(得分: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(",") + ")";
}

如果我正在寻找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','"')]

这是一个(更短的)Java版本。如果删除类型信息,它与JavaScript完全相同。感谢https://stackoverflow.com/users/1850609/acdcjunior

String escapedText = "concat('"+originalText.replace("'", "', \"'\", '") + "', '')";!

答案 1 :(得分:6)

在XPath 2.0和XQuery 1.0中,字符串文字的分隔符可以通过加倍来包含在字符串文字中:

let $a := "He said ""I won't"""

let $a := 'He said "I can''t"'

约定来自SQL。

答案 2 :(得分:5)

这是一个例子

/*/*[contains(., "'") and contains(., '"') ]/text()

将此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>

选择了想要的正确结果(单个文本节点):

I'm reading "Harry Potter"

以下是使用XPath Visualizer 进行的验证(我在12年前创建的免费开源工具,它已经让XPath成为了成千上万人的有趣方式):

enter image description here

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

答案 3 :(得分:1)

此外,如果你使用XQuery而不是XPath,正如标题所说,你也可以使用xml实体:

   "&quot; for double and &apos; for single quotes"

它们也可以在单引号中使用

答案 4 :(得分:1)

您可以使用正则表达式执行此操作。例如(作为ES6代码):

export function escapeXPathString(str: string): string {
    str = str.replace(/'/g, `', "'", '`);

    return `concat('${str}', '')`;
}

这将用'替换输入字符串中的所有', "'", '

最终, ''很重要,因为concat('string')是错误。

答案 5 :(得分:0)

嗯,我在同一个任务中,过了一会儿,我发现xpath没有支持这个,安静令人失望!但我们总能解决它!

我想要一些简单而直接的东西。我带来的是设置你自己的撇号替换,一种独特的代码(你在xml文本中不会遇到的东西),我选择了//'// 例如。现在你将它放在xml文本和xpath查询中。 (对于xml,你没有写,我们总是可以用任何编辑器的替换功能替换)。 现在我们怎么办?我们正常搜索,检索结果,并将// //替换为&#39;。

从我正在做的事情中得到一些样本:(replace_special_char_xpath()就是你需要做的)

function repalce_special_char_xpath($str){
    $str = str_replace("//apos//","'",$str);
    /*add all replacement here */
    return $str;
}

function xml_lang($xml_file,$category,$word,$language){ //path can be relative or absolute
    $language = str_replace("-","_",$language);// to replace - with _ to be able to use "en-us", .....
    $xml = simplexml_load_file($xml_file);
    $xpath_result = $xml->xpath("${category}/def[en_us = '${word}']/${language}");
    $result = $xpath_result[0][0];
    return repalce_special_char_xpath($result);
}

xml文件中的文字:

<def>
     <en_us>If you don//apos//t know which server, Click here for automatic connection</en_us>   <fr_fr>Si vous ne savez pas quelle serveur, Cliquez ici pour une connexion automatique</fr_fr>    <ar_sa>إذا لا تعرفوا أي سرفير, إضغطوا هنا من أجل إتصال تلقائي</ar_sa>
</def>

和php文件中的调用(生成的html):

<span><?php echo xml_lang_body("If you don//apos//t know which server, Click here for automatic connection")?>