2013-02-13 58 views
-2

我试图找出一种方法,确保感兴趣的元素不会(递归地)包含“相同”元素。例如: -XSLT - XPath,某些类型的最深元素

<Ev> 
    <Ev attr="0"> 
     <Ev someOtherAttr="str1"> 
     <Ev attr="1"> 
      <Ev> 
      </Ev> 
     </Ev> 
     </Ev> 
    </Ev> 
</Ev> 

在这里,我想确保我拥有的元素是最深的一个与属性命名ATTR(属性值可以是任意的,不应该被匹配,也不考虑)。

因此,在这种情况下,我想选择<Ev attr="1">出两个 “张玉峰” 元素:

<Ev attr="0"><Ev atttr="1">

我一直想做什么:

<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> 

如果部分当然不好,也许一个for-each select="<condition_a> and not(<condition_b>)"将是走?

(编辑什么我已经试过的问题)

问候 手枪先生,

+1

你有没有在你的最终尝试新鲜事物@皮特?如果是,那么你需要发布你已经尝试过。如果没有,那么你应该尝试一下自己并发布!因为“这里是要求,给我代码”类型的问题不被鼓励,通常被视为作业的东西,并得到许多downvotes和关闭的投票.. – 2013-02-13 10:06:59

+0

请告诉我们你到目前为止的XSLT,以及这将适合于。 – JLRishe 2013-02-13 10:21:56

+0

对不起,不知道。但我会在未来:-)。现在我添加了我的想法。 – PistolPete 2013-02-13 11:08:23

回答

2

以下XPath表达式应该工作,虽然这不是很有效:

//Ev[@attr and not(.//Ev[@attr])] 
+0

我会尽快尝试(会议)。 – PistolPete 2013-02-13 11:11:46

+0

谢谢,它完美地满足了我的需求! – PistolPete 2013-02-13 15:45:11

1

会是这样的满足您的需求?

<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> 

当示例XML运行,这将产生:

4 
+0

不!实际上,他希望它被推广..说如果有更多的名称为“Ev”的元素具有'@ someOtherAttr',出现在具有'@ someOtherAttr'的'Ev'下,那么应该忽略孩子..或者如果它有一个应该保留更多属性'@ attr'! – 2013-02-13 10:20:01

+0

这就是我所理解的,当他说'相同'的元素。 – 2013-02-13 10:20:19

+0

感谢您的努力,但我去的nwellnhofs解决方案。 – PistolPete 2013-02-13 15:49:25