2011-08-12 157 views
2

我想檢查文檔中是否有內聯樣式表,但我不確定如何挑選元素的後代屬性,因爲「樣式」屬性可以附加到主體元素中的任何元素。這是當前的XPath我寫:如何檢查一個屬性是否在一個元素中?

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

但是解析器拋出錯誤說:「意外令牌‘@’軸名後」。任何人都可以告訴我如何解決這個問題,或者有另一種方法來解決這個問題?謝謝!

回答

3

所以,你有一個@style屬性我想在文檔內的任何地方尋找任何元素。

如果你想包含要下列屬性的元素:

descendant::*[@style] 

這將返回有一個@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了關於如何解決正確答案通過

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

使用

//@style 

但是,對於那些想知道誰爲什麼最初的XPath不工作,以及是否有一個變種使用self::,這將工作...

請記住,@是一個ab軸的缺省值爲attribute::。所以self::@fooself::attribute::foo的簡寫。但從語法上來說,在一個位置步驟中只能有一個軸。這就是解析器拒絕self::@style的原因:它有兩個軸。

這裏還有其他有趣的事情發生。你可能會認爲你能解決這個表達式如下:

//@*[self::style] 

(暫時忽略的事實,這是不必要的更復雜,//@style當你想除了style所有屬性你開始嘗試這樣的表情,例如//@*[not(self::style)]。)

該表達式解析並運行時沒有錯誤。第一部分//@*匹配文檔中的所有屬性節點。你可能會認爲(和我一樣),謂詞[self::style]只要其上下文節點爲style屬性就會評估爲真值。

但是我們會錯的。如果我們嘗試它,我們會得到一個空的節點集。爲什麼?如果上下文節點是屬性節點,並且軸僅包含上下文節點,並且屬性的名稱與self::之後的名稱匹配,那麼謂詞中的表達式是否應該讓該屬性節點作爲其結果?

On p。 XSLT 2.0和XPath 2.0(第4版)的1228,自軸的術語定義解釋:

主要節點的自軸的樣元件,這意味着 ,當上下文節點是屬性,所述 形式的軸線步驟self::*self::xyz將不選擇該屬性[粗體強調礦。

但是,在XPath 2.0中,您可以使用self::attribute(style)。即你可以使用KindTest而不是NameTest。

邁克爾凱詳細說明了哪些節點可以通過p上的NameTest進行匹配的規則。 695.

相關問題