Bonjour à tous

J'ai un petit souci avec les nœuds texte d'un élément XML.

Voilà j'ai un élément XML qui renferme du texte et d'autres éléments comme ceci :

<A> Bla bla 1 <B> .....</B> Bla bla 2 </A>


En XSLT j'ai un template sur A dans lequel je voudrais récupérer la taille totale de tous les nœuds texte de A ( soit la longueur de ' Bla bla 1' + la longueur de 'Bla bla 2' ).

J'ai essaye :

string-length(normalize-space(text()))


en pensant que
text()
contenait TOUS les nœuds texte.

Surprise : le résultat ne contient que la longueur de ' Bla bla 1' autrement dit du PREMIER nœud texte.

J'ai vérifié en faisant une boucle
<xsl:for-each>
qu'il y avait bien deux nœuds texte !

Mais impossible d'additionner les deux longueurs dans la boucle for-each et surtout de sortir le résultat de la boucle !

Si vous avez une idée , elle sera la bienvenue !

Desiderius
Salut

Je et propose 2 façons, une via un appel de template nommer get-all-node-text, et la seconde à base de match. Après ça dépend ce que tu veux, y a moyen de combiné les 2 aussi.

Par contre j'ai pas réussi à faire sans le for-each Smiley ohwell .


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
	version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output
	method="text"
	indent="yes"
	encoding="UTF-8"
	omit-xml-declaration="no"
	doctype-system="about:legacy-compat"/>

<xsl:template name="get-all-node-text">
	<xsl:param name="node"/>
	<xsl:for-each select="$node/text()">
		<xsl:value-of select="."/>
	</xsl:for-each>
</xsl:template>

<!-- retourne les nœuds texte -->
<xsl:template match="A/text()">
	<xsl:value-of select="." />
</xsl:template>
<!-- ignore les autre nœud -->
<xsl:template match="A/*">
</xsl:template>
<!-- affiche la taille du texte des nœuds textes direct -->
<xsl:template match="A">
	<xsl:variable name="text-only">
		<xsl:apply-templates select="./node()"/>
	</xsl:variable>
	<xsl:value-of select="string-length(normalize-space($text-only))" />
</xsl:template>

<xsl:template match="/root">
<xsl:variable name="text-only">
	<xsl:call-template name="get-all-node-text">
		<xsl:with-param name="node" select="A"/>
	</xsl:call-template>
</xsl:variable>
[<xsl:value-of select="$text-only" />]
[<xsl:value-of select="string-length(normalize-space($text-only))" />]

<!-- A enfant de root donc il faut appeler le template explicitement -->
[<xsl:apply-templates select="A"/>]
</xsl:template>

</xsl:stylesheet>


<root>
	<A> Bla bla 1 <B> .....</B> Bla bla 2 </A>
</root>