dポイントプレゼントキャンペーン実施中!

お世話になります。
現在、XPathに関するプログラムを制作しています。
入力されたXPathを解析し、解析した内容に応じて特定の処理をさせるというものなのですが、text() 関数の解析で躓いています。

text()="value"

ここまではわかります。

text()='value1"value2\value3'

上のケースでは、どのように記述すればいいのでしょうか?
シングルコーテーションで括るという解では、シングルコーテーションとダブルコーテーションが混在している場合に対応できません。
そのプログラムではクオート文字をダブルコーテーションに限定しているので、ダブルコーテーションのエスケープ方法を探しています。
現在はバックスラッシュ(\)によるエスケープ処理で対応しています。

text()="value1\"value2\\value3"

しかし、Firefox拡張「XPath Checker」で調べるとバックスラッシュによるエスケープ処理は働いていないため、
この方法は正しくない気がしています。
プログラムとしては問題なく動作していますが、XPath記法に沿っていないのは落ち着きません。

何かヒントとなる情報はないでしょうか?

A 回答 (1件)

一つのリテラルで表記するのは無理だと思います。

…と思ったんだけどなあ

まず,XPath 1.0規格で一つのリテラルで表現する事はできないようです。
http://www.w3.org/TR/xpath#NT-Literal

>そのプログラムではクオート文字をダブルコーテーションに限定しているので、
これがなく,一つのリテラルでなくて良い(計算結果でも良い)なら
回避策として
concat("AB'C",'DE"F')
とかどうにでもなるとは思うんですが。

念のためにXPath 2.0の構文を調べてみたら
http://www.w3.org/TR/xpath20/#id-literals
EscapeQuotやEscapeAposなんてものがあるので
多分"abc""def"というような表記が可能なようです。

#XPath 1.0同様にあとはXQuery 1.0 and XPath 2.0 Functionsの
http://www.w3.org/TR/xpath-functions/#func-codep …
で計算してごまかすぐらい?

#実際にアドオンをインストールしていないのでFirefox AddonsがXPath 2.0に対応しているかは判りません。
#本題とは関係ないけど,プログラムのユーザーが
文字列を入力してそれが含まれるような要素を探すようなプログラムなら,XPath Injectionとか怖いから
文字列をXPath Expressionに直接つながないで,要素加えてからやるかな。
    • good
    • 1
この回答へのお礼

XPath1.0仕様上ではエスケープ手段が用意されていないのですね。
あの後、仕様書に行き着きましたが理解が足りないだけかも、との思いから先に進めずにいました。

> EscapeQuotやEscapeAposなんてものがあるので
ありがとうございます!
この方法でエスケープするようにしてみます。
(残念ながら、「XPath Checker」では機能しませんでした。XPath2.0準拠の動作ではないようです。)

> #本題とは関係ないけど,プログラムのユーザーが
> 文字列を入力してそれが含まれるような要素を探すようなプログラムなら
逆にユーザが入力したXPathに対応したノードを作成します。(XPathの文法は借りましたが、動作は逆です)
例えば、以下のように。

入力: p[@class="xpath"][text()="XPathですよ"]
出力: <p class="xpath">XPathですよ</p>

お礼日時:2009/05/13 23:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!