XPath pour renvoyer la concaténation de chaîne des valeurs de nœud enfant éligibles

StackOverflow https://stackoverflow.com/questions/1403971

  •  05-07-2019
  •  | 
  •  

Question

Quelqu'un peut-il suggérer un format d'expression XPath renvoyant une valeur de chaîne contenant les valeurs concaténées de certains nœuds enfants qualifiants d'un élément, mais en ignorant les autres:

<div>
    This text node should be returned.
    <em>And the value of this element.</em>
    And this.
    <p>But this paragraph element should be ignored.</p>
</div>

La valeur renvoyée doit être une chaîne unique:

This text node should be returned. And the value of this element. And this.

Est-ce possible dans une seule expression XPath?

Merci.

Était-ce utile?

La solution

Dans XPath 1.0:

Vous pouvez utiliser

/div//text()[not(parent::p)]

pour capturer les nœuds de texte recherchés. La concaténation elle-même ne peut pas être réalisée dans XPath 1.0, je vous recommande de le faire dans l’application hôte.

Autres conseils

Dans XPath 2.0 :

string-join (/ * / node () [not (self :: p)], '')

/div//text()

la double barre oblique force l'extraction du texte sans tenir compte des nœuds intermédiaires

Ce look qui fonctionne:

Utilisation comme contexte / div / :

text() | em/text()

Ou sans utiliser de contexte:

/div/text() | /div/em/text()

Si vous voulez concaténer les deux premières chaînes, utilisez ceci:

concat(/div/text(), /div/em/text())

Si vous voulez que tous les enfants sauf p, vous pouvez essayer ce qui suit ...

    string-join(//*[name() != 'p']/text(), "")

qui retourne ...

This text node should be returned.
And the value of this element.
And this.

Vous pouvez également utiliser une boucle for-each et assembler les valeurs dans une variable comme celle-ci

<xsl:variable name="newstring">
    <xsl:for-each select="/div//text()">
      <xsl:value-of select="."/>
    </xsl:for-each>
  </xsl:variable>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top