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

tac*_*ach 2 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>
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*hev 8

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

使用此XPath表达式:

//b[not(ancestor::a
             [parent::c[parent::a]
            and
              not(preceding-sibling::a)
             ]
       )
   ]
Run Code Online (Sandbox Code Playgroud)

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

给出以下XML文档(基于提供的,但是在应该选择的节点中制作格式良好并且还要标识文本):

<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>
Run Code Online (Sandbox Code Playgroud)

确切地选择了想要的6个b元素.

使用XSLT进行验证:

<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>
Run Code Online (Sandbox Code Playgroud)

当此转换应用于上述XML文档时,将精确b选择所需元素并将其复制到输出中.产生了想要的正确结果:

<b>This node 1</b>
<b>This node 2</b>
<b>This node 3</b>
<b>This node 4</b>
<b>This node 5</b>
<b>This node 6</b>
Run Code Online (Sandbox Code Playgroud)