XPath pour renvoyer la concaténation de chaîne des valeurs de nœud enfant éligibles
-
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.
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>