2011-12-01 59 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