EPITA         
XML et les services Web

Jean-François Perrot 

Exemple de recopie avec modifications.


  1. But de la transformation
  2. Solution
  3. 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" ..."/>