XSLT (opérations avancées) : expressions régulières et fichiers texte

Récupération et tri de villes dans un fichier texte non XML

Récupération et trie de villes dans un fichier texte non XML

L'objectif de l'exercice est de récupérer des noms de villes dans un fichier texte non XML et de les classer par ordre alphabétique dans un fichier XML.

Résultat attendu :

1
<?xml version="1.0" encoding="UTF-8"?>
2
<cities>
3
<city>Hafnarfjörður</city>
4
<city>Kópavogur</city>
5
<city>LA</city>
6
<city>Liverpool</city>
7
<city>London</city>
8
<city>Lyon</city>
9
<city>Manchester</city>
10
<city>NY</city>
11
<city>Paris</city>
12
<city>Reykjavik</city>
13
<city>SF</city>
14
<city>Toulouse</city>
15
</cities>

Question

Récupérer le contenu du fichier sans les caractères '-' et placer les chaînes de caractères obtenues entre les balises <cities>...<cities>.

exo2_input.txt

Indice

Utiliser la commande unparsed-text($href, $encoding) pour récupérer le fichier texte.

Indice

Utiliser la fonction tokenize($input, $pattern) pour gérer les caractères '-'.

Solution

Solution

1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
3
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
    exclude-result-prefixes="xs"
5
    version="2.0">
6
    
7
    <xsl:output method="xml"></xsl:output>  
8
    <xsl:template match="/">
9
        <xsl:text>&#xa;</xsl:text>
10
        <cities>                  
11
            <xsl:for-each select="tokenize(unparsed-text('exo2_input.txt', 'iso-8859-1'), '-')">                          
12
                <xsl:text>&#xa;</xsl:text>
13
                    <xsl:copy></xsl:copy>
14
            </xsl:for-each>           
15
        <xsl:text>&#xa;</xsl:text>
16
        </cities>
17
    </xsl:template>   
18
    
19
</xsl:stylesheet>
20

Question

Maintenant il faut sélectionner uniquement les noms de villes et les classer par ordre alphabétique entre les balises <city>...</city>.

On suppose que le fichier texte source est et sera toujours généré cette façon : Pays1-Ville1-Ville2-Ville3-Pays3-...

Indice

Pour récupérer la position d'un élément dans un for-each, on utilise la fonction position() (indexation à partir de 1).

Indice

Il est possible d'ajouter une contrainte supplémentaire à la sélection dans le for-each : select="tokenize(...)[ma_contrainte]".

Indice

La fonction <xsl:sort data-type="text" ...></xsl> permet de trier des chaînes de caractères.

Solution

Solution

1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
3
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
    exclude-result-prefixes="xs"
5
    version="2.0">
6
    
7
    <xsl:output method="xml"></xsl:output>  
8
    <xsl:template match="/">
9
        <xsl:text>&#xa;</xsl:text>
10
        <cities>                  
11
            <xsl:for-each select="tokenize(unparsed-text('exo2_input.txt', 'iso-8859-1'), '-')[(position() - 1) mod 4  != 0]">
12
                <xsl:sort select="." data-type="text" order="ascending"></xsl:sort>          
13
                <xsl:text>&#xa;</xsl:text>
14
                <city>
15
                    <xsl:copy></xsl:copy>
16
                </city>
17
            </xsl:for-each>           
18
            <xsl:text>&#xa;</xsl:text>
19
        </cities>
20
    </xsl:template>   
21
    
22
</xsl:stylesheet>
23
PrécédentPrécédentFin
AccueilAccueilImprimerImprimer Karim El Aktaa (Contributions : Stéphane Crozat et les étudiants de NF29) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)