EPITA
XML et les services Web
Jean-François
Perrot
Exemple de recopie avec modifications.
- But de la transformation
- Solution
- Discussion
But
de la transformation
À partir d'un fichier XML comme le suivant : (fichier Trad.xml
)
<?xml version='1.0'?>
<traductions>
<langues>
<nom>Français</nom>
<nom>Portugais</nom>
<nom>Anglais</nom>
<nom>Grec</nom>
<nom>Chinois</nom>
</langues>
<liste>
<terme Français="grec" Portugais="Grêgo"
Anglais="Greek" Grec="Ελληνικα" Chinois="希腊语"/>
<terme
Français="acquisition /Modification / Présentation de divers
parametres"
Portugais="Obtenção/Modificação/Apresentação de
diversos parâmetros"
Anglais="Definition / Modification / Presentation
of various parameters"
Grec="Εισαγωγή/Παραμετροποίηση διαφόρων
παραμέτρων" Chinois="采集/修改/介绍各种参数"/>
<terme
Français="Acquistions/ Modifications"
Portugais="Aquisições/Modificações"
Anglais="Add/Modify" Grec="Εισαγωγές/Αλλαγές"
Chinois="采集/修改"/>
<terme
Français="Accélération" Portugais="Aceleração" Anglais="Acceleration"
Grec="Επιτάχυνση" Chinois="快放"/>
<terme
Français="actions" Portugais="Acções" Anglais="Actions"
Grec="Ενέργειες" Chinois="行动"/>
<terme
Français="caserne " Portugais="Quartel" Anglais="Fire station"
Grec="Πυροσβεστικός σταθμός"
Chinois="消防一队"/>
<terme
Français="Durée" Portugais="Duração" Anglais="Duration" Grec="Διάρκεια"
Chinois="持续时间"/>
</liste>
</traductions>
il s'agit d'engendrer un fichier où les termes sont pourvus d'un
identificateur ayant pour valeur leur rang dans l'ordre alphabétique
suivant l'attribut "Français
".
En l'occurrence :
<?xml version='1.0'?>
<traductions>
<langues>
<nom>Français</nom>
<nom>Portugais</nom>
<nom>Anglais</nom>
<nom>Grec</nom>
<nom>Chinois</nom>
</langues>
<liste>
<terme id="1"
Français="Accélération" Portugais="Aceleração" Anglais="Acceleration"
Grec="Επιτάχυνση" Chinois="快放"/>
<terme id="2" Français="acquisition /Modification / Présentation
de divers parametres"
Portugais="Obtenção/Modificação/Apresentação de diversos parâmetros"
Anglais="Definition / Modification /
Presentation of various parameters"
Grec="Εισαγωγή/Παραμετροποίηση
διαφόρων παραμέτρων" Chinois="采集/修改/介绍各种参数"/>
<terme id="3" Français="Acquistions/ Modifications"
Portugais="Aquisições/Modificações"
Anglais="Add/Modify"
Grec="Εισαγωγές/Αλλαγές" Chinois="采集/修改"/>
<terme id="4" Français="actions" Portugais="Acções"
Anglais="Actions" Grec="Ενέργειες" Chinois="行动"/>
<terme id="5" Français="caserne " Portugais="Quartel"
Anglais="Fire station"
Grec="Πυροσβεστικός σταθμός"
Chinois="消防一队"/>
<terme id="6" Français="Durée" Portugais="Duração"
Anglais="Duration" Grec="Διάρκεια" Chinois="持续时间"/>
<terme id="7" Français="grec" Portugais="Grêgo" Anglais="Greek"
Grec="Ελληνικα" Chinois="希腊语"/>
</liste>
</traductions>
Solution
Voici une manière de faire - certainement pas la seule ! (fichier TriNum.xsl
)
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version='1.0'>
<xsl:output method="xml" encoding="utf-8" />
<xsl:strip-space elements="*"/>
<xsl:template match="/traductions">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="langues">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="liste">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="@Français" lang="fr" case-order= "upper-first"
/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="terme">
<xsl:copy>
<xsl:attribute
name="id">
<xsl:value-of
select="position()"/>
</xsl:attribute>
<xsl:copy-of
select="@*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Discussion
À noter que le résultat ci-dessus a été obtenu avec le transformateur
Java.
xsltproc
, pour sa part, a une
interprétation
différente de 'case-order= "upper-first"
':
<terme
id="1" Français="Accélération" ....../>
<terme id="2"
Français="Acquistions/ Modifications" .../>
<terme id="3" Français="Durée"
..../>
<terme id="4"
Français="acquisition /Modification / Présentation de divers
parametres" .../>
<terme id="5" Français="actions"
... />
<terme id="6" Français="caserne "
..."/>
<terme id="7" Français="grec"
..."/>