XPath / XmlCompiledTransform:使用XPath函数测试父级

时间:2011-12-01 10:50:23

标签: c# .net xslt xpath xslcompiledtransform

我不确定我是否真的犯了错误,或者这是不是正常工作:

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

如果当前节点是第一个孩子,或者它的父母是第一个孩子,那么做一些特殊的事情。

问题是“parent :: position()= 1”..带.net的XmlCompiledTransform我得到了

表达式的预期结束,找到'('。... sition()= 1或parent :: position - &gt;(&lt; - = 1。

现在,显然它不喜欢第二部分中的position()函数,但是..我如何得到父母的位置?通常,我如何在测试中 XPath函数与XPath结合起来?

1 个答案:

答案 0 :(得分: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>