大文字と小文字を区別しない XPath contains() は可能ですか? 質問する

大文字と小文字を区別しない XPath contains() は可能ですか? 質問する

DOM のすべてのテキストノードを実行し、nodeValue に特定の文字列が含まれているかどうかを確認します。

/html/body//text()[contains(.,'test')]

Test大文字と小文字が区別されます。ただし、 、TEST、もキャッチしたいですTesT。XPath (JavaScript) で可能ですか?

ベストアンサー1

これはXPath 1.0用です。環境がXPath 2.0をサポートしている場合は、ここ


はい。可能ですが、美しくはありません。

/html/body//text()[
  contains(
    translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'test'
  )
]

これは、アルファベットが事前にわかっている検索文字列に有効です。表示されると予想されるアクセント付き文字を追加します。


可能であれば、<span>HTML の構築中に特定のクラスを持つ で囲むなど、他の方法で興味のあるテキストをマークします。このようなものは、要素テキスト内の部分文字列よりも XPath で見つけるのがはるかに簡単です。

それが選択肢にない場合は、JavaScript (または XPath を実行するために使用している他のホスト言語) を使用して、動的な XPath 式を構築することができます。

function xpathPrepare(xpath, searchString) {
  return xpath.replace("$u", searchString.toUpperCase())
              .replace("$l", searchString.toLowerCase())
              .replace("$s", searchString.toLowerCase());
}

xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
// -> "//text()[contains(translate(., 'TEST', 'test'), 'test')]"

(感謝します@KirillPolishchuk の回答- もちろん、実際に翻訳したい文字だけを翻訳すればいいのです検索のために。)

このアプローチは、アルファベットの事前知識を必要とせず、どのような検索文字列でも機能するため、大きな利点となります。

上記の方法は両方とも、検索文字列にシングルクォートが含まれる場合に失敗します。その場合、より複雑

おすすめ記事