2011-08-12 5 views
2

文書内にインラインスタイルシートがあるかどうかチェックしたいが、body要素内の要素に "style"属性を付けることができるので、要素の子孫属性を選択する方法がわからない。これは私が書き込み電流のXPathです:属性が要素内に存在するかどうかをチェックする方法?

descendant::@*[self::@style] 

しかしパーサーというエラーがスローされます:「予期しないトークン 『@』軸名の後に」。誰かが私にそれを修正する方法を教えてもらえますか、これを行う別の方法がありますか?ありがとう!

答えて

3

属性を選択します、あなたは私が考える@style属性を持つドキュメント内の任意の場所に任意の要素を探しています。

あなたは以下にする属性が含まれている要素が必要な場合:@style属性を持つ現在のノードのすべての子孫の要素を返します

descendant::*[@style] 

。属性自体が必要な場合は、次のようなものを使用する方が良いでしょう。

descendant::*[@style]/@style 

これですべてのスタイル属性が見つかります。

+0

これは良い解決策です。ありがとう! – Michael

+0

'descendant :: *'は、コンテキストノードが '/'でない限り間違った答えを返します。この場合、 '// *'と等価です。 '/ descendant :: * @ @ style @/@ style'は'/descendant :: */@ style'と同じです。 '// */@ style'は' // @ style'と同じです。 – LarsH

2

使用このXPathの://@style、それはすべてがそうstyle

+0

+1。これはより良い答えです。 – LarsH

0

@Kirillが

//@style 

を使用することによりしかし初期XPathが動作しない理由をを知りたい人のため

descendant::@*[self::@style] 

を修正する方法についての正しい答えを与えた、とするかどうかself::を使用したバリアントがあります。

@はabですattribute::軸の細分化。だからself::@fooself::attribute::fooの略です。しかし構文的には、ロケーションステップには1つの軸しか存在しません。だからこそ、パーサはself::@styleを拒否します:それは2つの軸を持っています。

ここで興味深いことがあります。あなたは次のように表現を修正することができると思うかもしれません:

//@*[self::style] 

(一瞬、これは不より複雑//@styleものであるという事実を無視し、すべてがstyle以外属性たいときは、このような表現をしようとして起動し、。例://@*[not(self::style)]

この式は、エラーを解析せずに実行されます。最初の部分、//@*は、文書内のすべての属性ノードに一致します。そして、文脈節点がstyle属性であるときはいつでも、述語[self::style]は真理値に評価されると思うかもしれません。

しかし、私たちは間違っています。試してみると、空のノードセットが得られます。どうして?コンテキストノードが属性ノードで、self::軸にコンテキストノードのみが含まれ、属性の名前がself::の後に続く名前と一致する場合、述語の式は結果としてその属性ノードを生成しませんか?

オンp。 (第4版)XSLT 2.0およびXPath 2.0の1228年、自己軸の用語の定義を説明:

自軸の種類主ノードが 場合、コンテキストノードのことを意味し、要素あります属性self::*又はself::xyzは[太字強調鉱山]属性選択しないであろう 形の軸ステップあります。

しかし、XPath 2.0の中で、あなたはself::attribute(style)を使用することができます。私。あなたはNameTestの代わりにKindTestを使うことができます。

Michael Kayは、pのNameTestとどのような種類のノードを一致させることができるかについて、かなり詳細に説明しています。 695.

関連する問題