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 :
<cities>
<city>Hafnarfjörður</city>
<city>Kópavogur</city>
<city>LA</city>
<city>Liverpool</city>
<city>London</city>
<city>Lyon</city>
<city>Manchester</city>
<city>NY</city>
<city>Paris</city>
<city>Reykjavik</city>
<city>SF</city>
<city>Toulouse</city>
</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>.
Utiliser la commande unparsed-text($href, $encoding) pour récupérer le fichier texte.
Utiliser la fonction tokenize($input, $pattern) pour gérer les caractères '-'.
Solution
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml"></xsl:output>
<xsl:template match="/">
<xsl:text>
</xsl:text>
<cities>
<xsl:for-each select="tokenize(unparsed-text('exo2_input.txt', 'iso-8859-1'), '-')">
<xsl:text>
</xsl:text>
<xsl:copy></xsl:copy>
</xsl:for-each>
<xsl:text>
</xsl:text>
</cities>
</xsl:template>
</xsl:stylesheet>
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-...
Pour récupérer la position d'un élément dans un for-each, on utilise la fonction position() (indexation à partir de 1).
Il est possible d'ajouter une contrainte supplémentaire à la sélection dans le for-each : select="tokenize(...)[ma_contrainte]".
La fonction <xsl:sort data-type="text" ...></xsl> permet de trier des chaînes de caractères.
Solution
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml"></xsl:output>
<xsl:template match="/">
<xsl:text>
</xsl:text>
<cities>
<xsl:for-each select="tokenize(unparsed-text('exo2_input.txt', 'iso-8859-1'), '-')[(position() - 1) mod 4 != 0]">
<xsl:sort select="." data-type="text" order="ascending"></xsl:sort>
<xsl:text>
</xsl:text>
<city>
<xsl:copy></xsl:copy>
</city>
</xsl:for-each>
<xsl:text>
</xsl:text>
</cities>
</xsl:template>
</xsl:stylesheet>