8

XPATHを使用して一重引用符を含むテキストを検索する方法がわかりません。

たとえば、この質問のタイトルに引用を追加しました。次の行

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

空の配列を返します。

しかし、私が次のことを試してみると

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

ページのタイトルへのリンクが返されますが、一重引用符と二重引用符の両方を受け入れることができるようにしたいので、一重引用符/二重引用符に合わせて調整することはできません。

このページのchromeまたはfirebugのコンソールで試すことができます。

4

6 に答える 6

13

これがハックアラウンド(Thanks 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("'", "', \"'\", '") + "', '')";!
于 2012-11-20T22:44:26.880 に答える
8

XPath2.0およびXQuery1.0では、文字列リテラルの区切り文字を2倍にすることで、文字列リテラルに含めることができます。

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

また

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

規則はSQLから借用されています。

于 2012-11-21T14:01:06.210 に答える
6

これは例です:

/*/*[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に何千人もの人々に楽しい方法を教えてくれました)を使用した検証は次のとおりです。

ここに画像の説明を入力してください

問題は、使用しているプログラミング言語でこのXPath式を文字列として指定できないことである可能性があります。これはXPathの問題ではなく、プログラミング言語の知識の問題です。

于 2012-11-20T21:37:26.770 に答える
1

さらに、タイトルにあるように、XPathの代わりにXQueryを使用している場合は、xmlエンティティを使用することもできます。

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

また、一重引用符内で機能します

于 2012-11-21T14:53:32.050 に答える
1

これは、正規表現を使用して行うことができます。例(ES6コードとして):

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

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

'これにより、入力文字列のすべてが。に置き換えられ', "'", 'ます。

ファイナルはエラー, ''なので重要です。concat('string')

于 2015-09-09T06:48:12.327 に答える
0

さて、私は同じ探求をしていましたが、しばらくすると、xpathにはこれに対するサポートがないことがわかりました。静かにがっかりしました!しかし、私たちはいつでもそれを回避することができます!

シンプルでまっすぐなものが欲しかった。私が持っているのは、アポストロフィの代わりに独自のコードを設定することです。これは、一種の一意のコード(xmlテキストでは発生しないもの)です。たとえば、//apos//を選択しました。これで、xmlテキストとxpathクエリの両方にそれを入れます。(xmlの場合、常に記述しているわけではありませんが、任意のエディターの置換関数に置き換えることができます)。そして今、私たちはどのようにしていますか?これで通常どおり検索し、結果を取得して、//apos//を'に戻します。

私がやっていたことからいくつかのサンプルを以下に示します:(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")?>
于 2017-05-24T13:37:19.990 に答える