获取没有特定祖先xml xpath的节点

时间:2011-05-16 02:35:57

标签: xml xpath ancestor

我想拥有xpath,它获取没有祖先的节点,祖先是特定节点的第一个后代。

我们假设我们有这样的xml文档:

<a>
  <b>This node</b>
  <c>
    <a>
      <b>not this</b>
      <g>
        <b>not this</b>
      </g>
    </a>
    <a>
      <b>This node</b>
      <c/>
    </a>
  </c>
</a>


<a>
  <c>
    <a>
      <b>not this</b>
    </a>
    <a>
      <b>This node</b> 
    </a>
    <a>
      <b>This node</b> 
    </a>
    <a>
      <b>This node</b> 
    </a>
  </c>
</a>


<d>
  <b>This node</b>
</d>

我想选择文档中没有作为祖先节点的所有b节点// a / c / a [1]。

1 个答案:

答案 0 :(得分:8)

  

我想选择所有b节点   没有他们的文件   祖先节点//a/c/a[1]

使用此XPath表达式

//b[not(ancestor::a
             [parent::c[parent::a]
            and
              not(preceding-sibling::a)
             ]
       )
   ]

这将选择文档中没有祖先b的所有a个元素,这些元素的父级c具有父级a a的{​​{1}}祖先不是其父级的第一个c子级。

鉴于以下XML文档(基于提供的,但在格式良好且在应该选择的节点中放置标识文本):

a

确切地选择了想要的6个<t> <a> <b>This node 1</b> <c> <a> <b>not this</b> <g> <b>not this</b> </g> </a> <a> <b>This node 2</b> <c/> </a> </c> </a> <a> <c> <a> <b>not this</b> </a> <a> <b>This node 3</b> </a> <a> <b>This node 4</b> </a> <a> <b>This node 5</b> </a> </c> </a> <d> <b>This node 6</b> </d> </t> 元素。

使用XSLT进行验证

b

当对上述XML文档应用此转换时,会精确选择所需的<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <xsl:copy-of select= "//b[not(ancestor::a [parent::c[parent::a] and not(preceding-sibling::a) ] ) ] "/> </xsl:template> </xsl:stylesheet> 元素并将其复制到输出中。产生了想要的正确结果

b