-1

我试图找到一种方法来确保感兴趣的元素不(递归地)包含“相同”元素。例如:

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

但是if部分当然不好,也许 for-eachselect="<condition_a> and not(<condition_b>)"是要走的路?

(用我尝试过的方法编辑了问题)

最好的问候,手枪先生

4

2 回答 2

2

下面的 XPath 表达式应该可以工作,尽管它不是很有效:

//Ev[@attr and not(.//Ev[@attr])]
于 2013-02-13T10:37:14.637 回答
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
于 2013-02-13T10:15:28.443 回答