我想檢查文檔中是否有內聯樣式表,但我不確定如何挑選元素的後代屬性,因爲「樣式」屬性可以附加到主體元素中的任何元素。這是當前的XPath我寫:如何檢查一個屬性是否在一個元素中?
descendant::@*[self::@style]
但是解析器拋出錯誤說:「意外令牌‘@’軸名後」。任何人都可以告訴我如何解決這個問題,或者有另一種方法來解決這個問題?謝謝!
我想檢查文檔中是否有內聯樣式表,但我不確定如何挑選元素的後代屬性,因爲「樣式」屬性可以附加到主體元素中的任何元素。這是當前的XPath我寫:如何檢查一個屬性是否在一個元素中?
descendant::@*[self::@style]
但是解析器拋出錯誤說:「意外令牌‘@’軸名後」。任何人都可以告訴我如何解決這個問題,或者有另一種方法來解決這個問題?謝謝!
所以,你有一個@style
屬性我想在文檔內的任何地方尋找任何元素。
如果你想包含要下列屬性的元素:
descendant::*[@style]
這將返回有一個@style
屬性的當前節點的所有後代元素。如果你想要屬性本身,你最好使用類似的東西:
descendant::*[@style]/@style
這會找到你自己的所有樣式屬性。
@Kirill了關於如何解決正確答案通過
descendant::@*[self::@style]
使用
//@style
但是,對於那些想知道誰爲什麼最初的XPath不工作,以及是否有一個變種使用self::
,這將工作...
請記住,@
是一個ab軸的缺省值爲attribute::
。所以self::@foo
是self::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.
你是對的,這是一個更好的解決方案。謝謝! – Michael
'descendant :: *'會給出錯誤的答案,除非上下文節點是'/',在這種情況下,它相當於'// *'。 '/ descendant :: * [@ style]/@ style'等價於'/ descendant :: */@ style'等價於'// */@ style'等同於'// @ style'。 – LarsH