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

C# XPath/XmlCompiledTransform:使用XPath函数测试父级,c#,.net,xslt,xpath,xslcompiledtransform,C#,.net,Xslt,Xpath,Xslcompiledtransform,我不确定我是否真的犯了错误,或者这是否只是工作不正常: <xsl:if test="position() = 1 or parent::position() = 1"> <!-- do something --> </xsl:if> 如果当前节点是第一个子节点,或者它的父节点是第一个子节点,则执行一些特殊操作 问题是“parent::position()=1”。。通过.net的XmlCompiledTransform,我得到了 应该是表达式的结尾,

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

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

如果当前节点是第一个子节点,或者它的父节点是第一个子节点,则执行一些特殊操作

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

应该是表达式的结尾,找到了“(”..sition()=1或parent::position-->”(好问题,+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>        


使用
parent::node()
是否比
parent::*
有优势?@Tomalak:它们是不同的。
parent::node()
在所有情况下都会提供父元素,而
父元素::*
如果将top元素作为上下文节点发出,则根本不会选择任何节点,但是父元素存在——它只是不是元素。没错,在document元素上,它确实会有所不同。在这种情况下,不一定会选择,因为可能没有p在这种情况下,兄弟姐妹越来越少,但无论如何。