Question

Je voudrais avoir xpath, qui obtient des nœuds, qui n'ont pas d'ancêtre, qui est le premier descendant du nœud spécifique.

Imaginons que nous avons de document xml comme ceci:

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

Je voudrais sélectionner tous les nœuds b dans le document qui n'ont pas comme leur ancêtre du nœud //a/c/a[1].

Était-ce utile?

La solution

Je voudrais sélectionner tous les nœuds b document qui n'ont pas leur ancêtre du nœud //a/c/a[1]

Utiliser cette expression XPath:

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

Cela sélectionne tous les b les éléments du document qui n'ont pas d'ancêtre a qui a un parent c qui a parent a et l' a ancêtre qui a parent c n'est pas la première a enfant de son parent.

Étant donné le document XML suivant (basé sur la condition, mais fait bien formé et également mis l'identification du texte dans les nœuds qui doit être sélectionné):

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

exactement le voulait 6 b les éléments sont sélectionnés.

Vérification à l'aide de 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>

lorsque cette transformation est appliquée sur le dessus de document XML, c'est exactement le voulais b les éléments sont sélectionnés et copiés vers la sortie.Le voulais, résultat correct est produit:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top