2013-06-20 85 views
7

我一直在研究一個XPath解析器,語法爲here作爲參考。我驚訝地發現@符號與KindTest是可能的。 KindTest可以是node(),comment(),text()processing-instruction(xyz)(它們測試Node Type)。'@comment()'在XPath中做什麼?

我的問題是這些與@符號組合時的結果; 。 @processing-instruction("xyz"),@comment(),@node@text做什麼?他們是否在搜索具有處理指令或註釋的屬性?

+0

我很好奇的語法爲什麼你寫的XPath解析器被禁止?聽起來很有趣...... :-) – LarsH

+0

...有點:)和:(,嘿,我把ITS裝飾的XML文檔轉換成HTML,而ITS必須留下來,但HTML必須是完全合法的,我需要更改文檔中所有節點的名稱,也要去除大多數屬性,但ITS中的所有XPath仍然必須工作,這意味着它們需要進行編輯以匹配新的節點,我決定一堆正則表達式的覆蓋面不夠,除非我看完整的語法規範,否則我對XPath的瞭解還不夠充分。 –

+1

哇!自動編輯XPath表達式爲匹配轉換後的文檔,我之前沒有聽說過有人試圖這樣做,我猜如果剩下的節點仍然具有相同的層次關係,那麼不會太難......只要XPath表達式不是太依賴於被刪除的節點。 – LarsH

回答

11

@comment()是一個有效的XPath位置路徑步驟表達式,保證不返回任何內容。從技術上講,它要求沿着屬性軸找到所有評論節點(並且你永遠不會找到任何)。

我告訴我的學生/..是一個更緊湊和可讀的方式來寫一個完整的位置路徑,保證不返回任何東西。從技術上講,它是要求根節點的父節點。

+0

爲什麼它甚至內置在語法中,如果它保證不返回任何內容? –

+0

語法已經在那裏用於其他用途。沒有必要明確否認這種可能性。 – GolezTrol

+2

歡迎來到SO,霍爾曼先生! XSL答案的質量剛剛上漲...... – LarsH

7

NateGlenn,這不是@comment()內置於語法。只是@comment()的組合不是特別禁止的。

如您所知,@只是attribute::軸的縮寫。軸是構建在語法中的。節點測試(如node()comment())被內置到語法的單獨部分。

爲了組合@comment()被語法禁止,必須有一個特殊情況。例如,您可以考慮其他組合,除了返回一個空的節點集外,其他組合都沒有什麼意義,例如:parent::text()

這是相當喜歡期待1/0sqrt(-1)由C.

+1

這很有趣。我沒有意識到'@'是'attribute ::'的縮寫。來自W3c [here](http://www.w3.org/2013/01/qt-applets/xpath1/jjdoc.html)的語法給出了'AbbrevForwardStep :: =(「@」)? NodeTest',我認爲這會更好,因爲AbbrevForwardStep :: =(「@」)? NameTest'。因爲它只是'attribute ::'的縮寫,所以我明白他們爲什麼這麼做。 –

+1

@NateGlenn:好點。我沒有意識到(或忘記了)該語法將'@'與未縮寫的軸放在單獨的規則中。但考慮他們是否說過AbbrevForwardStep :: =(「@」)? NameTest'。那麼你不能擁有'@comment()',但是你仍然可以擁有'attribute :: comment()'。這將是一個奇怪的不對稱。你也會失去說'@node()'的能力,這是一個更有用的構造(儘管AFAICT,它相當於'@ *',你不會失去它)。 – LarsH

+1

如果使用NameTest而不是NodeTest定義了AbbrevForwardStep,那麼不僅會丟失'@comment()',還會失去'comment()'(child :: comment()'的簡寫形式)和所有縮寫測試在不是節點測試的子軸上。將正交性看作是目的本身的一個理由是在修改語法時避免這種無意的附帶損害。 –