XSLT-XPath,特定类型的最深元素
我试图找到一种方法来确保感兴趣的元素不(递归地)包含“相同”的元素。例如:XSLT-XPath,特定类型的最深元素,xslt,xpath,Xslt,Xpath,我试图找到一种方法来确保感兴趣的元素不(递归地)包含“相同”的元素。例如: <Ev> <Ev attr="0"> <Ev someOtherAttr="str1"> <Ev attr="1"> <Ev> </Ev> </Ev> </Ev> </Ev> </Ev>
<Ev>
<Ev attr="0">
<Ev someOtherAttr="str1">
<Ev attr="1">
<Ev>
</Ev>
</Ev>
</Ev>
</Ev>
</Ev>
在这里,我想确保我拥有的元素是最深的元素,属性名为attr(属性值可以是任意的,不应该匹配也不应该考虑)
因此,在本例中,我想从两个“缩进”元素中选择
:
和
我的目标是:
<xsl:for-each select="//Ev/@attr">
<xsl:if select="//*[not(child::Ev/@attr)]">
<xsl:value-of select="count(ancestor::node())"/>
</xsl:if>
</xsl:for-each>
但是如果部分当然不好,那么可能每个select=“and not()”
都有一个对应的方法
(用我尝试过的内容编辑问题)
致以最良好的祝愿,
皮斯托尔先生,这种东西适合你的需要吗
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="//Ev[@attr]" mode="deepest">
<xsl:sort select="count(ancestor::*)" data-type="number" order="descending" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Ev" mode="deepest">
<xsl:if test="position() = 1">
<!-- If we get to the inside of this xsl:if, the context node is
the deepest Ev in the selection -->
<xsl:value-of select="count(ancestor::node())"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
以下XPath表达式应该可以工作,尽管它不是很有效:
//Ev[@attr and not(.//Ev[@attr])]
你试过什么吗@Pete?如果是,那么你需要发布你尝试过的内容。如果没有,那么你应该自己尝试一些东西并发布!因为“这是要求,为我提供代码”类型的问题不受鼓励,通常被视为家庭作业,并获得许多反对票和接近票。请向我们展示您目前拥有的XSLT以及该XSLT的适用范围。抱歉,我不知道这一点。但我将来会:-)。现在我添加了我的想法。不!实际上,他想把它推广开来。。假设在
Ev
having@someOtherAttr
下出现另一个名为Ev
having@someOtherAttr
的元素,则应忽略子元素。。或者,如果它还有一个属性@attr
,那么应该保留它!谢谢你的努力,但我选择了nwellnhofs解决方案。我会尽快试用。谢谢,它完全符合我的需要!
//Ev[@attr and not(.//Ev[@attr])]