Developpez.com

XML

Choisissez la catégorie, puis la rubrique :

logo
Sommaire > Le 'XML Stylesheet Language : Transformations' (XSLT) > Feuilles XSLT > Chaines de caractères
        Fonction 'Replace'
        Nombre d'occurences d'une chaîne
        Extraire la chaîne la plus fréquente



Auteur : Erwan Amoureux
Version : 06/02/2007
Fonction "Replace"
Permet de substituer une chaîne à une autre, un nombre maximal de fois.
Le XML

<?xml version="1.0" encoding="UTF-8"?>
<text>
Ce fichier servira de test pour verifier les fonctions.
Ce fichier servira de test pour verifier les fonctions.
</text>
Le XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
	<res>
		<test2>
	<xsl:call-template name="Replace">
	<xsl:with-param name="chaine" select="text"></xsl:with-param>
	<xsl:with-param name="chaineCherche" select="'test'"></xsl:with-param>
	<xsl:with-param name="chaineRempl" select="'essai'"></xsl:with-param>
		<xsl:with-param name="Occur" select="1"></xsl:with-param>
	</xsl:call-template>	
	</test2>
	<test1>
	<xsl:call-template name="Replace">
	<xsl:with-param name="chaine" select="text"></xsl:with-param>
	<xsl:with-param name="chaineCherche" select="'test'"></xsl:with-param>
	<xsl:with-param name="chaineRempl" select="'essai'"></xsl:with-param>
	</xsl:call-template>
	</test1>

	</res>
	
	</xsl:template>
	<xsl:template name="Replace">
	<!--remplace une chaine par une autre-->
		<xsl:param name="chaine"/>
		<xsl:param name="chaineCherche"/>
		<xsl:param name="chaineRempl"/>
		<xsl:param name="Occur"/>
		<!--si Occur n'est pas rempli il remplace toutes les occurences-->
		<xsl:choose>
			<xsl:when test="contains($chaine,$chaineCherche) ">
				<xsl:choose>
					<xsl:when test="number($Occur)=0">
				<xsl:value-of select="$chaine"/>
					</xsl:when>
					<xsl:when test="$Occur>0">
						<xsl:call-template name="Replace">
							<xsl:with-param name="chaine" select="concat(substring-before($chaine,$chaineCherche),$chaineRempl,substring-after($chaine,$chaineCherche))"/>
							<xsl:with-param name="chaineCherche" select="$chaineCherche"/>
							<xsl:with-param name="chaineRempl" select="$chaineRempl"/>
							<xsl:with-param name="Occur" select="$Occur - 1"/>
						</xsl:call-template>
					</xsl:when>
					<xsl:otherwise>
								<xsl:call-template name="Replace">
							<xsl:with-param name="chaine" select="concat(substring-before($chaine,$chaineCherche),$chaineRempl,substring-after($chaine,$chaineCherche))"/>
							<xsl:with-param name="chaineCherche" select="$chaineCherche"/>
							<xsl:with-param name="chaineRempl" select="$chaineRempl"/>
						</xsl:call-template>
						
					</xsl:otherwise>
				</xsl:choose>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$chaine"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>
Le Résultat

<?xml version="1.0" encoding="UTF-8"?>
<res>
	<test2>
Ce fichier servira de essai pour verifier les fonctions.
Ce fichier servira de test pour verifier les fonctions.
</test2>
	<test1>
Ce fichier servira de essai pour verifier les fonctions.
Ce fichier servira de essai pour verifier les fonctions.
</test1>
</res>

Auteur : Erwan Amoureux
Version : 06/02/2007
Nombre d'occurences d'une chaîne
La fonction translate permet de remplacer caractère par caractère, mais on a plus souvent besoin de remplacer toute une partie de la chaîne, ce template permet de le faire.
Le XML

<?xml version="1.0" encoding="UTF-8"?>
<text>
Ce fichier servira de test pour verifier les fonctions.
Ce fichier servira de test pour verifier les fonctions.
</text>
Le XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
	<res>
	nombre de fois (test):
	<xsl:call-template name="CharOccur">
	<xsl:with-param name="chaine" select="text"></xsl:with-param>
	<xsl:with-param name="chaineCherche" select="'test'"></xsl:with-param>
	</xsl:call-template>	

	</res>
	
	</xsl:template>
		<xsl:template name="CharOccur">
		<!-- nombre d'occurence d'une chaine-->
		<xsl:param name="chaine"/>
		<xsl:param name="chaineCherche"/>
		<xsl:param name="Occur" select="0"/>
		<xsl:choose>
			<xsl:when test="contains($chaine,$chaineCherche) ">
				<xsl:call-template name="CharOccur">
					<xsl:with-param name="chaine" select="substring-after($chaine,$chaineCherche)"/>
					<xsl:with-param name="chaineCherche" select="$chaineCherche"/>
					<xsl:with-param name="Occur" select="$Occur+1"/>
				</xsl:call-template>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$Occur"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>
Le Résultat

<?xml version="1.0" encoding="UTF-8"?>
<res>
	nombre de fois (test) :
	2
</res>

Auteur : Erwan Amoureux
Version : 06/02/2007
Extraire la chaîne la plus fréquente
Permet de récupérer la chaîne (ou le nombre) présent le plus fréquement dans un document.
Le XML

<?xml version="1.0" encoding="UTF-8"?>
<liste>
	<y>a</y>
	<y>b</y>
	<y>a</y>
	<y>b</y>
	<y>b</y>
	<y>c</y>
	<y>a</y>
	<y>b</y>
</liste>
Le XSLT

<?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"/>
	<xsl:template match="/">
	La chaîne revenant le plus souvent : <xsl:call-template name="maxOccur">
	<xsl:with-param name="noeuds" select="*/*"></xsl:with-param>
	</xsl:call-template>	
	Nombre d'occurrence de cette chaine : <xsl:call-template name="maxOccurNb">
	<xsl:with-param name="noeuds" select="*/*"></xsl:with-param>
	</xsl:call-template>	
	</xsl:template >
	<xsl:template name="maxOccur">
	<!--valeur revenant le plus frequemment dans un node-set-->
		<xsl:param name="noeuds"/>
		<xsl:choose>
			<xsl:when test="not($noeuds[.!=$noeuds[1]])">
				<xsl:value-of select="$noeuds[1]"/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:choose>
					<xsl:when test="count($noeuds[.=$noeuds[1]]) >= count($noeuds[.=($noeuds[. != $noeuds[1]])[1]])">
						<xsl:call-template name="maxOccur">
							<xsl:with-param name="noeuds" select="$noeuds[.!=($noeuds[. != $noeuds[1]])[1]]"/>
						</xsl:call-template>
					</xsl:when>
					<xsl:otherwise>
						<xsl:call-template name="maxOccur">
							<xsl:with-param name="noeuds" select="$noeuds[.!=$noeuds[1]]"/>
						</xsl:call-template>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
			<xsl:template name="maxOccurNb">
	<!--nombre de repetition de la valeur la plus frequente dans un node-set-->
		<xsl:param name="noeuds"/>
		<xsl:choose>
			<xsl:when test="not($noeuds[.!=$noeuds[1]])">
				<xsl:value-of select="count($noeuds)"/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:choose>
					<xsl:when test="count($noeuds[.=$noeuds[1]]) >= count($noeuds[.=($noeuds[. != $noeuds[1]])[1]])">
						<xsl:call-template name="maxOccurNb">
							<xsl:with-param name="noeuds" select="$noeuds[.!=($noeuds[. != $noeuds[1]])[1]]"/>
						</xsl:call-template>
					</xsl:when>
					<xsl:otherwise>
						<xsl:call-template name="maxOccurNb">
							<xsl:with-param name="noeuds" select="$noeuds[.!=$noeuds[1]]"/>
						</xsl:call-template>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	</xsl:stylesheet>
Le Résultat

La chaîne revenant le plus souvent : b
Nombre d'occurrence de cette chaine : 4


Consultez les autres pages sources


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Contacter le responsable de la rubrique XML