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在这种情况下,兄弟姐妹越来越少,但无论如何。