2011-12-01 61 views
1

我不知道如果我真的做了一個錯誤,或者如果這只是工作不正常:如果當前節點是第一個孩子的XPath/XmlCompiledTransform:測試使用XPath功能父

<xsl:if test="position() = 1 or parent::position() = 1"> 
    <!-- do something --> 
</xsl:if> 

,或者它的父母是第一個孩子,然後做一些特別的事情。

的問題是 「父::位置()= 1」。與.NET的XmlCompiledTransform我得到

預計表達的結束時,找到 '(' ... sition()= 1或父::位置 - >(< - = 1

現在,它顯然不喜歡在第二部分中那個位置()函數,但..我如何得到父母的位置怎麼辦?我,一般結合 XPath功能與XPaths在測試?

回答

2

好問題和,+1。

您需要定義父位置的含義。

parent::node()[position() = 1] 

總是true()當父節點存在(是false()只有在上下文節點是此節點的文檔節點/是頂級節點的樹,沒有父),因爲根據定義,樹中的任何節點(格式良好的XML文檔)最多隻能有一個父節點。

很可能,您想要測試父元素是其兄弟姐妹中文檔順序中的第一個元素。要測試的一種方法是:

not(parent::node()/preceding-sibling::*) 

所以,完整的代碼變得

<xsl:if test="position() = 1 or not(parent::node()/preceding-sibling::*)">   
    <!-- do something -->   
</xsl:if>   
+0

是否有優勢,在使用'父::節點()''以上父:: * '? – Tomalak

+0

@Tomalak:他們不一樣。 'parent :: node()'在所有情況下都存在父項,而parent :: *如果以top元素作爲上下文節點發出,根本不選擇任何節點,但父項存在 - 它只是不是一個元素。 –

+0

你是對的,在文件元素上它確實會有所作爲。對於這種情況不一定是這樣,因爲在那個位置不能有兄弟姐妹,但是。 – Tomalak