ONYX - 9.0 - Utilisation - Traitements XSL

Différence entre versions

De MappingDoc
(Tri, réagencement, regroupement de lignes)
 
(34 révisions intermédiaires par 3 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
=Préambule=
+
<languages/>
 +
<translate>
 +
==Préambule== <!--T:1-->
  
 +
<!--T:2-->
 
Cette documentation aborde des principes simples du XSLT. Mapping ne pourra en aucun cas faire le support des XSL réalisés par ses utilisateurs (clients ou partenaires). Cette documentation a uniquement pour but d'aider ses utilisateurs à profiter de cette fonctionnalité.
 
Cette documentation aborde des principes simples du XSLT. Mapping ne pourra en aucun cas faire le support des XSL réalisés par ses utilisateurs (clients ou partenaires). Cette documentation a uniquement pour but d'aider ses utilisateurs à profiter de cette fonctionnalité.
  
=Principes=
+
==Principes== <!--T:3-->
  
 +
<!--T:4-->
 
La suite Mapping Onyx permet l'utilisation des fonctionnalités XSLT, le but étant de modifier la structure d'un fichier XML en une autre.
 
La suite Mapping Onyx permet l'utilisation des fonctionnalités XSLT, le but étant de modifier la structure d'un fichier XML en une autre.
  
  
 +
<!--T:5-->
 
Cette transformation peut être appelée soit directement et nativement dans Designer, ou soit nativement dans le moteur de règles via l'utilisation d'une "boite" du Workflow.
 
Cette transformation peut être appelée soit directement et nativement dans Designer, ou soit nativement dans le moteur de règles via l'utilisation d'une "boite" du Workflow.
  
 +
<!--T:6-->
 
Cette nouvelle fonctionnalité propre à Onyx permet notamment la modification d'un flux XMLDRAW en un autre (voir détails dans le chapitre Avantages).
 
Cette nouvelle fonctionnalité propre à Onyx permet notamment la modification d'un flux XMLDRAW en un autre (voir détails dans le chapitre Avantages).
  
=Avantages=
+
==Avantages== <!--T:7-->
  
 +
<!--T:8-->
 
Le principal avantage de cette nouvelle fonctionnalité est la '''possibilité de traiter un flux générique en entrée <u>tout en gardant un flux de sortie personnalisé</u>.'''
 
Le principal avantage de cette nouvelle fonctionnalité est la '''possibilité de traiter un flux générique en entrée <u>tout en gardant un flux de sortie personnalisé</u>.'''
  
 +
<!--T:9-->
 
D'une manière très simple, Onyx offre la possibilité de modifier le flux en entrée de Mapping sans devoir retoucher le programme générant ce même flux. Il est alors très simplement possible pour un ou plusieurs documents donnés de (liste non exhaustive) :
 
D'une manière très simple, Onyx offre la possibilité de modifier le flux en entrée de Mapping sans devoir retoucher le programme générant ce même flux. Il est alors très simplement possible pour un ou plusieurs documents donnés de (liste non exhaustive) :
  
 +
<!--T:10-->
 
#Filtrer des informations
 
#Filtrer des informations
 
#Trier les lignes d'un tableau
 
#Trier les lignes d'un tableau
Ligne 24 : Ligne 33 :
 
#Réaliser des conversions de formats de dates
 
#Réaliser des conversions de formats de dates
  
=Appels=
+
==Appels== <!--T:11-->
  
 +
<!--T:12-->
 
Il existe 2 façons d'appeler les feuilles XSL :
 
Il existe 2 façons d'appeler les feuilles XSL :
  
==Workflow==
+
===Workflow=== <!--T:13-->
  
 +
<!--T:14-->
 
Pour appeler le XSL dans le moteur de règles Mapping (Workflow), il faut utiliser une boite Workflow de type CMD et appeler le programme M-XSLTransform en utilisant la commande suivante :
 
Pour appeler le XSL dans le moteur de règles Mapping (Workflow), il faut utiliser une boite Workflow de type CMD et appeler le programme M-XSLTransform en utilisant la commande suivante :
 
  [%PATH_BIN%]/M-XSLTransform "[%MAP_FILE_IN%]" "[%PATH_XSL%]/MaFeuilleXSL.xsl" "[%MAP_FILE_OUT%]"
 
  [%PATH_BIN%]/M-XSLTransform "[%MAP_FILE_IN%]" "[%PATH_XSL%]/MaFeuilleXSL.xsl" "[%MAP_FILE_OUT%]"
Ligne 38 : Ligne 49 :
 
- '''MAP_FILE_OUT''' : chemin + nom du fichier de sortie de la "boite" du workflow<br>
 
- '''MAP_FILE_OUT''' : chemin + nom du fichier de sortie de la "boite" du workflow<br>
  
==Designer==
+
===Designer=== <!--T:15-->
  
 +
<!--T:16-->
 
Il est également possible d'appeler des feuilles de transformation XSL directement dans Designer. Le gros avantage par rapport aux appels dans le Workflow est l'aspect intégration native dans Designer. En effet, la feuille XSL permet de personnaliser le document (tri sur les lignes, suppression de lignes, ajout de ligne, gestion des veuves et orphelines, etc.) et fait alors partie intégrante du projet Designer
 
Il est également possible d'appeler des feuilles de transformation XSL directement dans Designer. Le gros avantage par rapport aux appels dans le Workflow est l'aspect intégration native dans Designer. En effet, la feuille XSL permet de personnaliser le document (tri sur les lignes, suppression de lignes, ajout de ligne, gestion des veuves et orphelines, etc.) et fait alors partie intégrante du projet Designer
  
 +
<!--T:17-->
 
Pour ce faire, il faut saisir le contenu de la feuille XSL dans la fenêtre de saisie accessible via le bouton '''Prétraitement XML''' de Designer encapsulé par '''#xsltransform;''' et '''#endxsltransform;'''
 
Pour ce faire, il faut saisir le contenu de la feuille XSL dans la fenêtre de saisie accessible via le bouton '''Prétraitement XML''' de Designer encapsulé par '''#xsltransform;''' et '''#endxsltransform;'''
  
 +
<!--T:18-->
 
<u>Syntaxe</u> :<br>
 
<u>Syntaxe</u> :<br>
 
<nowiki>#xsltransform;</nowiki><br>
 
<nowiki>#xsltransform;</nowiki><br>
Ligne 49 : Ligne 63 :
 
<nowiki>#endxsltransform;</nowiki>
 
<nowiki>#endxsltransform;</nowiki>
  
 +
<!--T:19-->
 
<br />
 
<br />
 
[[Fichier:OX D XLS 1.jpg|vignette|450x450px|alt=|néant]]
 
[[Fichier:OX D XLS 1.jpg|vignette|450x450px|alt=|néant]]
  
=Exemples de feuilles de style XSL=
+
==Exemples de feuilles de style XSL== <!--T:20-->
 
Etant donné que nous partons généralement d'un flux XMLDRAW vers un autre flux XMLDRAW, il est possible de créer des exemples de templates XSL ayant chacun une ou plusieurs fonctionnalités bien spécifiques :
 
Etant donné que nous partons généralement d'un flux XMLDRAW vers un autre flux XMLDRAW, il est possible de créer des exemples de templates XSL ayant chacun une ou plusieurs fonctionnalités bien spécifiques :
  
 +
<!--T:21-->
 
Pour structurer la suite de cette documentation, nous allons partir d'un exemple simple recopiant simplement le flux d'entrée. Dans les exemples qui suivront, nous allons mettre en avant les différences par rapport à cet exemple "coquille générique" afin d'arriver aux résultats souhaités.
 
Pour structurer la suite de cette documentation, nous allons partir d'un exemple simple recopiant simplement le flux d'entrée. Dans les exemples qui suivront, nous allons mettre en avant les différences par rapport à cet exemple "coquille générique" afin d'arriver aux résultats souhaités.
  
==Coquille générique : Simple copie du flux d'entrée==
+
===Coquille générique : Simple copie du flux d'entrée=== <!--T:22-->
 
Cet exemple n'a pas de fonction en tant que telle (car il n'est pas utile d'appliquer un traitement XSL si on applique aucune modification aux flux de données) mais sera utilisé par tous les autres exemples qui suivront comme flux générique commun à tous les exemples.
 
Cet exemple n'a pas de fonction en tant que telle (car il n'est pas utile d'appliquer un traitement XSL si on applique aucune modification aux flux de données) mais sera utilisé par tous les autres exemples qui suivront comme flux générique commun à tous les exemples.
  
  <span style="color:green"><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
+
<!--T:23-->
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs  
+
<span style="color:green">
fn"></span>
+
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
<span style="color:green"><xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/></span>
+
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
  <span style="color:red"><xsl:template match="@*|*|comment()"></span>
+
</span>
  <span style="color:red"><xsl:copy></span>
+
  <span style="color:green"><xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/></span>
    <span style="color:red"><xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/></span>
+
  <span style="color:red"><xsl:template match="@*|*|comment()"></span>
   <span style="color:red"></xsl:copy></span>
+
    <span style="color:red"><xsl:copy></span>
 +
      <span style="color:red"><xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/></span>
 +
    <span style="color:red"></xsl:copy></span>
 +
   <span style="color:red"></xsl:template></span>
 
  <span style="color:green"></xsl:stylesheet></span>
 
  <span style="color:green"></xsl:stylesheet></span>
  
 +
<!--T:24-->
 
<u>Bon à savoir :</u><br>
 
<u>Bon à savoir :</u><br>
 
<span style="color:green">Entete de la feuille XSL</span><br>
 
<span style="color:green">Entete de la feuille XSL</span><br>
 
<span style="color:red">template de simple recopie</span>
 
<span style="color:red">template de simple recopie</span>
  
==Supprimer des types de ligne dans un groupe==
+
===Supprimer des types de ligne dans un groupe=== <!--T:25-->
  
 +
<!--T:26-->
 
Cet exemple permet de supprimer les types de lignes '''info_remise''' et '''info_compo''' de tous les groupes '''article''' du document.
 
Cet exemple permet de supprimer les types de lignes '''info_remise''' et '''info_compo''' de tous les groupes '''article''' du document.
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
+
  <!--T:27-->
 +
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs  
 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs  
 
  fn">
 
  fn">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
+
  <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
 +
 
   <span style="color:red"><xsl:template match="/doc/page/group[@name='Article']/line[@name='info_remise']"/></span> 
 
   <span style="color:red"><xsl:template match="/doc/page/group[@name='Article']/line[@name='info_remise']"/></span> 
 
   <span style="color:red"><xsl:template match="/doc/page/group[@name='Article']/line[@name='info_compo']"/></span> 
 
   <span style="color:red"><xsl:template match="/doc/page/group[@name='Article']/line[@name='info_compo']"/></span> 
    <xsl:template match="@*|*|comment()">
+
      <xsl:copy>
+
  <xsl:template match="@*|*|comment()">
      <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
+
  <xsl:copy>
      </xsl:copy>
+
    <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
    </xsl:template>
+
  </xsl:copy>
 +
  </xsl:template>
 
  </xsl:stylesheet>
 
  </xsl:stylesheet>
  
==Ajouter une première ligne et une dernière ligne d'un groupe==
+
===Ajouter une première ligne et une dernière ligne dans un groupe=== <!--T:28-->
===Sur tous les groupes===
+
====Sur tous les groupes====
 
Cet exemple permet d'ajouter une ligne de début (first_line) et une ligne de fin (last_line) sur tous les groupes du flux d'entrée.
 
Cet exemple permet d'ajouter une ligne de début (first_line) et une ligne de fin (last_line) sur tous les groupes du flux d'entrée.
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
+
  <!--T:29-->
 +
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
+
  <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
<span style="color:red"><xsl:template match="group">
+
  <span style="color:red"><xsl:template match="group">
 
         <xsl:copy>
 
         <xsl:copy>
 
             <xsl:apply-templates select="@*"/>
 
             <xsl:apply-templates select="@*"/>
Ligne 105 : Ligne 130 :
 
             <line name="last_line"/>
 
             <line name="last_line"/>
 
         </xsl:copy>
 
         </xsl:copy>
    </xsl:template></span> 
+
  </xsl:template></span> 
    <xsl:template match="@*|*|comment()">
+
  <xsl:template match="@*|*|comment()">
 
       <xsl:copy>
 
       <xsl:copy>
      <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
+
        <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
 
       </xsl:copy>
 
       </xsl:copy>
    </xsl:template>
+
  </xsl:template>
 
  </xsl:stylesheet>
 
  </xsl:stylesheet>
  
===Sur un groupe spécifique : Article===
+
====Sur un groupe spécifique : Article==== <!--T:30-->
 
Cet exemple permet d'ajouter une ligne de début (first_line) et une ligne de fin (last_line) uniquement sur le ou les groupes Article du flux d'entrée.
 
Cet exemple permet d'ajouter une ligne de début (first_line) et une ligne de fin (last_line) uniquement sur le ou les groupes Article du flux d'entrée.
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
+
  <!--T:31-->
 +
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
 
  <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
 
  <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
Ligne 133 : Ligne 159 :
 
  </xsl:stylesheet>
 
  </xsl:stylesheet>
  
==Supprimer tous les groupes : group1==
+
===Supprimer tous les groupes : group1=== <!--T:32-->
  
 +
<!--T:33-->
 
Cet exemple permet de supprimer tous les groupes group1 (présents sous /doc/page) du flux d'entrée.
 
Cet exemple permet de supprimer tous les groupes group1 (présents sous /doc/page) du flux d'entrée.
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
+
  <!--T:34-->
 +
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  
 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
 
  <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
 
  <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
Ligne 148 : Ligne 176 :
 
  </xsl:stylesheet>
 
  </xsl:stylesheet>
  
==Trier les lignes du groupe group1 par ordre décroissant==
+
===Trier les lignes du groupe group1 par ordre décroissant=== <!--T:35-->
  
 +
<!--T:36-->
 +
Cet exemple permet de trier toutes les lignes du groupe group1 du flux d'entrée par ordre décroissant de valeur de l'attribut name.
  
Cet exemple permet de trier toutes les lignes du groupe group1 du flux d'entrée par ordre décroissant de valeur de l'attribut name.
+
<!--T:37-->
 +
<u>Feuille XSL</u> :
 +
 
 +
<!--T:38-->
 +
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
 +
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs
 +
fn">
 +
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
 +
<span style="color:red"><xsl:template match="/doc/page/group[@name='group1']">
 +
  <xsl:copy>
 +
  <xsl:apply-templates select="@*"/>
 +
    <xsl:apply-templates>
 +
      <xsl:sort select="./@name" data-type="text" order="descending"/>
 +
  </xsl:apply-templates>
 +
  </xsl:copy>
 +
  </xsl:template></span> 
 +
    <xsl:template match="@*|*|comment()">
 +
      <xsl:copy>
 +
      <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
 +
      </xsl:copy>
 +
    </xsl:template>
 +
</xsl:stylesheet>
  
XML d'entrée :
+
<!--T:39-->
 +
<u>Exemple de XML en entrée :</u>
  
  <doc>
+
  <!--T:40-->
 +
<doc>
 
  <page>
 
  <page>
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
  <field name="field3">ValueField3</field>
+
  <span style="color:red"><group name="group1"></span>
<field name="field4">ValueField4</field>
+
  <span style="color:red"><line name="line1"></span>
  <group name="group1">
 
<line name="line1">
 
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
  <line name="line2">
+
  <span style="color:red"><line name="line2"></span>
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
  <line name="line3">
+
  <span style="color:red"><line name="line3"></span>
<field name="field1">ValueField1</field>
 
<field name="field2">ValueField2</field>
 
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
</line>
 
<line name="line4">
 
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
 
  </group>
 
  </group>
Ligne 191 : Ligne 230 :
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
 
  <line name="line2">
 
  <line name="line2">
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
</line>
 
<line name="line3">
 
<field name="field1">ValueField1</field>
 
<field name="field2">ValueField2</field>
 
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
</line>
 
<line name="line4">
 
<field name="field1">ValueField1</field>
 
<field name="field2">ValueField2</field>
 
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
 
  </group>
 
  </group>
Ligne 216 : Ligne 239 :
 
  </doc>
 
  </doc>
  
 +
<!--T:41-->
 
<u>Flux généré en sortie</u> :
 
<u>Flux généré en sortie</u> :
  
  <?xml version="1.0" encoding="utf-8"?>
+
  <!--T:42-->
 +
<?xml version="1.0" encoding="utf-8"?>
 
  <doc>
 
  <doc>
 
  <page>
 
  <page>
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
+
  <span style="color:red"><group name="group1"></span>
<field name="field4">ValueField4</field>
 
<group name="group1">
 
  <span style="color:red"><line name="line4"></span>
 
<field name="field1">ValueField1</field>
 
<field name="field2">ValueField2</field>
 
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
</line>
 
 
  <span style="color:red"><line name="line3"></span>
 
  <span style="color:red"><line name="line3"></span>
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
 
  <span style="color:red"><line name="line2"></span>
 
  <span style="color:red"><line name="line2"></span>
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
 
  <span style="color:red"><line name="line1"></span>
 
  <span style="color:red"><line name="line1"></span>
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
 
  </group>
 
  </group>
Ligne 255 : Ligne 266 :
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
 
  <line name="line2">
 
  <line name="line2">
 
  <field name="field1">ValueField1</field>
 
  <field name="field1">ValueField1</field>
 
  <field name="field2">ValueField2</field>
 
  <field name="field2">ValueField2</field>
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
</line>
 
<line name="line3">
 
<field name="field1">ValueField1</field>
 
<field name="field2">ValueField2</field>
 
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
</line>
 
<line name="line4">
 
<field name="field1">ValueField1</field>
 
<field name="field2">ValueField2</field>
 
<field name="field3">ValueField3</field>
 
<field name="field4">ValueField4</field>
 
 
  </line>
 
  </line>
 
  </page>
 
  </page>
 
  </doc>
 
  </doc>
  
<u>Feuille XSL utilisée</u> :
+
===Tri, réagencement, regroupement de lignes=== <!--T:43-->
 
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
 
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs
 
fn">
 
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
 
<span style="color:red"><xsl:template match="/doc/page/group[@name='group1']">
 
  <xsl:copy>
 
  <xsl:apply-templates select="@*"/>
 
    <xsl:apply-templates>
 
      <xsl:sort select="./@name" data-type="text" order="descending"/>
 
  </xsl:apply-templates>
 
  </xsl:copy>
 
  </xsl:template></span> 
 
    <xsl:template match="@*|*|comment()">
 
      <xsl:copy>
 
      <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
 
      </xsl:copy>
 
    </xsl:template>
 
</xsl:stylesheet>
 
 
 
==Tri, réagencement, regroupement de lignes==
 
 
 
  
 +
<!--T:44-->
 
Cet exemple permet de :<br>
 
Cet exemple permet de :<br>
 
<span style="color:red"> - Trier les lignes info_livraison des groupes Article par ordre alphabétique croissant de valeur du champs Date_LivConf<br></span>
 
<span style="color:red"> - Trier les lignes info_livraison des groupes Article par ordre alphabétique croissant de valeur du champs Date_LivConf<br></span>
 
<span style="color:green"> - Afficher les autres lignes du groupe Article dans un certain ordre : Info_livraison puis info_article puis info_remise puis info_compo et en dernier toutes les lignes commençant par la valeur tailles<br></span>
 
<span style="color:green"> - Afficher les autres lignes du groupe Article dans un certain ordre : Info_livraison puis info_article puis info_remise puis info_compo et en dernier toutes les lignes commençant par la valeur tailles<br></span>
 
<span style="color:orange"> - Ecrire la ligne info_livraison uniquement si la valeur de son champ date_LivConf est différent de la ligne info_livraison précédente<br></span>
 
<span style="color:orange"> - Ecrire la ligne info_livraison uniquement si la valeur de son champ date_LivConf est différent de la ligne info_livraison précédente<br></span>
 +
 +
<!--T:45-->
 +
<u>Feuille XSL :</u>
 +
 +
<!--T:46-->
 +
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  version="2.0" exclude-result-
 +
prefixes="xsl xs">
 +
  <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
 +
  <span style="color:red"><xsl:template match="/doc/page">
 +
    <page>
 +
    <!-- traiter tous les noeuds sauf les group name='Article' (ils seront tous recopiés en l'état grâce au dernier template ci-
 +
  dessous) -->
 +
    <xsl:apply-templates select="*[not(self::group[@name='Article'])]"/>
 +
      <!-- traiter les noeuds group Article en les triant en fonction de la date de livraison confirmée (c'est un tri sur une
 +
  chaîne de caractères, on pourrait trier sur la semaine de livraison, confirmée ou demandée, ...) -->
 +
    <xsl:apply-templates select="group[@name='Article']">
 +
      <xsl:sort select="line[@name='info_livraison']/field[@name='Date_LivConf']" data-type="text" order="ascending"/>
 +
    </xsl:apply-templates>
 +
    </page>
 +
  </xsl:template>
 +
    <!-- cas des noeuds group Article -->
 +
  <xsl:template match="group[@name='Article']">
 +
      <!-- ajouter le noeud dans le document résultat puis traiter ses fils -->
 +
    <group name="Article">
 +
      <!-- Un noeud group est composé de lignes qu'on va ordonner dans l'ordre suivant : info-liraison, info_article, info_remise,
 +
  info_compo, tailles croissantes -->
 +
      <!-- On ne recopie les infos de livraison que si la date de livraison confirmée de ce noeud n'est pas déjà apparue dans un
 +
  noeud précédent (on va comparer l'info dans le noeud courant avec ./ et dans les noeuds précédents avec prededing-sibling) -->
 +
      <xsl:if test="not(preceding-sibling::group[@name='Article']/line[@name='info_livraison']/field[@name='Date_LivConf'] =
 +
./line[@name='info_livraison']/field[@name='Date_LivConf'])">
 +
      <!-- recopier les infos de livraison -->
 +
      <xsl:apply-templates select="./line[@name='info_livraison']"/>
 +
    </xsl:if>
 +
      <!-- recopier les infos article -->
 +
    <xsl:apply-templates select="./line[@name='info_article']"/>
 +
      <!-- recopier les infos remise -->
 +
    <xsl:apply-templates select="./line[@name='info_remise']"/>
 +
      <!-- recopier les infos compo -->
 +
    <xsl:apply-templates select="./line[@name='info_compo']"/>
 +
      <!-- recopier les infos taille en recopiant ces lignes par nom de taille croissant -->
 +
    <xsl:apply-templates select="./line[starts-with(@name, 'tailles')]">
 +
    <xsl:sort select="@name" data-type="text" order="ascending"/>
 +
    </xsl:apply-templates>
 +
    </group>
 +
  </xsl:template></span>
 +
    <!-- copie basique des noeuds, attributs, commentaires -->
 +
  <xsl:template match="@*|*|comment()">
 +
    <xsl:copy>
 +
    <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
 +
    </xsl:copy>
 +
  </xsl:template>
 +
</xsl:stylesheet>
  
  
  
<u>XML d'entrée (uniquement les groupes Article pour simplifier la lisibilité du document)</u> :
+
<!--T:47-->
 +
<u>Exemple de XML en entrée (uniquement les groupes Article pour simplifier la lisibilité du document)</u> :
  
  <group name="Article">
+
  <!--T:48-->
 +
<group name="Article">
 
   <line name="info_livraison">
 
   <line name="info_livraison">
 
   <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
   <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
   <field name="Sem_LivDem">39</field>
 
   <field name="Sem_LivDem">39</field>
     <span style="color:red"><field name="Date_LivConf">20181020</field>                  //Cette ligne sera triée par valeru de Date_LivConf</span>
+
     <span style="color:red"><field name="Date_LivConf">'''20181020'''</field>                  //la ligne de ce champs sera triée par valeur de Date_LivConf</span>
 
   <field name="Sem_LivConf">39</field>
 
   <field name="Sem_LivConf">39</field>
 
   </line>
 
   </line>
 
   <line name="info_article">
 
   <line name="info_article">
  <field name="Num_Ligne">00001</field>
 
  <field name="Type_Ligne">R</field>
 
 
   <field name="Reference">HOLDEN734</field>
 
   <field name="Reference">HOLDEN734</field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
  <field name="GTIN_Taille_Echantillon">03789456062585</field>
 
 
   </line>
 
   </line>
   <span style="color:green">//Ces 2 lignes seront interverties car le template XSL fait afficher la ligne info_remise avant la ligne info_compo</span>
+
   <span style="color:green">//Ces 2 lignes seront interverties car le template XSL fait afficher la ligne info_remise avant la ligne  
 +
info_compo</span>
 
   <span style="color:green"><line name="info_compo">
 
   <span style="color:green"><line name="info_compo">
 
   <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 
   <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
Ligne 335 : Ligne 361 :
 
   <line name="tailles_1">
 
   <line name="tailles_1">
 
   <field name="Qte">20</field>
 
   <field name="Qte">20</field>
  <field name="Unt_Oeuvre">U</field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
  <line name="tailles_2">
 
  <field name="Qte">2</field>
 
 
   <field name="Unt_Oeuvre">U</field>
 
   <field name="Unt_Oeuvre">U</field>
 
   <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
   <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
Ligne 345 : Ligne 366 :
 
  </group>
 
  </group>
 
  <group name="Article">
 
  <group name="Article">
 
+
  <span style="color:orange">//Cette ligne ne sera pas affichée car la valeur de Date_LivConf de la ligne info_livraison précédente est la même  
  <span style="color:orange">//Cette ligne ne sera pas affichée car la valeur de Date_LivConf de la ligne info_livraison précédente est la même (20181020)</span>
+
(20181020)
 
   <line name="info_livraison">
 
   <line name="info_livraison">
 
   <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
   <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
   <field name="Sem_LivDem">39</field>
 
   <field name="Sem_LivDem">39</field>
   <span style="color:orange"><field name="Date_LivConf">20181020</field></span>
+
   <field name="Date_LivConf">'''20181020'''</field>
 
   <field name="Sem_LivConf">39</field>
 
   <field name="Sem_LivConf">39</field>
   </line>
+
   </line></span>
 
   <line name="info_article">
 
   <line name="info_article">
  <field name="Num_Ligne">00001</field>
 
  <field name="Type_Ligne">R</field>
 
 
   <field name="Reference">HOLDEN734</field>
 
   <field name="Reference">HOLDEN734</field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
  <field name="GTIN_Taille_Echantillon">03789456062585</field>
 
 
   </line>
 
   </line>
 
   <span style="color:green">//Ces 2 lignes seront interverties car le template XSL fait afficher la ligne info_remise avant la ligne  
 
   <span style="color:green">//Ces 2 lignes seront interverties car le template XSL fait afficher la ligne info_remise avant la ligne  
Ligne 378 : Ligne 396 :
 
   <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
   <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
   <field name="Sem_LivDem">39</field>
 
   <field name="Sem_LivDem">39</field>
     <span style="color:red"><field name="Date_LivConf">20190101</field>                  //Cette ligne sera triée par valeru de Date_LivConf</span>
+
     <span style="color:red"><field name="Date_LivConf">20190101</field>                  //la ligne de ce champs sera triée par valeur de  
 +
Date_LivConf</span>
 
   <field name="Sem_LivConf">39</field>
 
   <field name="Sem_LivConf">39</field>
 
   </line>
 
   </line>
 
   <line name="info_article">
 
   <line name="info_article">
  <field name="Num_Ligne">00001</field>
 
  <field name="Type_Ligne">R</field>
 
 
   <field name="Reference">HOLDEN734</field>
 
   <field name="Reference">HOLDEN734</field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
  <field name="GTIN_Taille_Echantillon">03789456062585</field>
 
 
   </line>
 
   </line>
 
   <line name="info_compo">
 
   <line name="info_compo">
Ligne 393 : Ligne 409 :
 
   <line name="tailles_1">
 
   <line name="tailles_1">
 
   <field name="Qte">20</field>
 
   <field name="Qte">20</field>
  <field name="Unt_Oeuvre">U</field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
  <line name="tailles_2">
 
  <field name="Qte">2</field>
 
  <field name="Unt_Oeuvre">U</field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
</group>
 
<group name="Article">
 
  <line name="info_livraison">
 
  <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
  <field name="Sem_LivDem">39</field>
 
    <span style="color:red"><field name="Date_LivConf">20170301</field>                  //Cette ligne sera triée par valeur de Date_LivConf</span>
 
  <field name="Sem_LivConf">39</field>
 
  </line>
 
  <line name="info_article">
 
  <field name="Num_Ligne">00001</field>
 
  <field name="Type_Ligne">R</field>
 
  <field name="Reference">HOLDEN734</field>
 
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
  <field name="GTIN_Taille_Echantillon">03789456062585</field>
 
  </line>
 
  <line name="info_remise">
 
  <field name="Remise_Totale_Ligne">5</field>
 
  </line>
 
  <line name="tailles_1">
 
  <field name="Qte">20</field>
 
  <field name="Unt_Oeuvre">U</field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
  <line name="tailles_2">
 
  <field name="Qte">2</field>
 
  <field name="Unt_Oeuvre">U</field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
</group>
 
<group name="Article">
 
  <line name="info_livraison">
 
  <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
  <field name="Sem_LivDem">39</field>
 
    <span style="color:red"><field name="Date_LivConf">20190101</field>                  //Cette ligne sera triée par valeru de Date_LivConf</span>
 
  <field name="Sem_LivConf">39</field>
 
  </line>
 
  <line name="info_article">
 
  <field name="Num_Ligne">00001</field>
 
  <field name="Type_Ligne">R</field>
 
  <field name="Reference">HOLDEN734</field>
 
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
  <field name="GTIN_Taille_Echantillon">03789456062585</field>
 
  </line>
 
  <line name="tailles_1">
 
  <field name="Qte">20</field>
 
  <field name="Unt_Oeuvre">U</field>
 
  </line>
 
  <line name="tailles_2">
 
  <field name="Qte">2</field>
 
 
   <field name="Unt_Oeuvre">U</field>
 
   <field name="Unt_Oeuvre">U</field>
 
   <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
   <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
Ligne 458 : Ligne 417 :
 
   <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
   <field name="Date_LivDem">2ème Qz Septembre 2014</field>
 
   <field name="Sem_LivDem">39</field>
 
   <field name="Sem_LivDem">39</field>
   <span style="color:red"><field name="Date_LivConf">20160101</field>                  //Cette ligne sera triée par valeru de Date_LivConf</span>
+
   <span style="color:red"><field name="Date_LivConf">20160101</field>                  //la ligne de ce champs sera triée par valeur de  
 +
Date_LivConf</span>
 
   <field name="Sem_LivConf">39</field>
 
   <field name="Sem_LivConf">39</field>
 
   </line>   
 
   </line>   
 
   <line name="info_article">
 
   <line name="info_article">
  <field name="Num_Ligne">00001</field>
 
  <field name="Type_Ligne">R</field>
 
 
   <field name="Reference">HOLDEN734</field>
 
   <field name="Reference">HOLDEN734</field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
  <field name="GTIN_Taille_Echantillon">03789456062585</field>
 
 
   </line>
 
   </line>
 
   <line name="info_compo">
 
   <line name="info_compo">
Ligne 485 : Ligne 442 :
  
  
 +
<!--T:49-->
 
<u>XML généré (uniquement les groupes Article pour simplifier la lisibilité du document)</u> :
 
<u>XML généré (uniquement les groupes Article pour simplifier la lisibilité du document)</u> :
  
  <group name="Article">
+
  <!--T:50-->
 +
<group name="Article">
 
   <line name="info_livraison">
 
   <line name="info_livraison">
 
   <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
 
   <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
 
   <field name="Sem_LivDem"><![CDATA[39]]></field>
 
   <field name="Sem_LivDem"><![CDATA[39]]></field>
  <field name="Date_LivConf"><![CDATA[20160101]]></field>
+
    <span style="color:red"><field name="Date_LivConf"><![CDATA[20160101]]></field></span>
 
   <field name="Sem_LivConf"><![CDATA[39]]></field>
 
   <field name="Sem_LivConf"><![CDATA[39]]></field>
 
   </line>
 
   </line>
 
   <line name="info_article">
 
   <line name="info_article">
  <field name="Num_Ligne"><![CDATA[00001]]></field>
 
  <field name="Type_Ligne"><![CDATA[R]]></field>
 
 
   <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
   <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
  <field name="GTIN_Taille_Echantillon"><![CDATA[03789456062585]]></field>
 
 
   </line>
 
   </line>
 
   <line name="info_compo">
 
   <line name="info_compo">
Ligne 519 : Ligne 475 :
 
   <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
 
   <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
 
   <field name="Sem_LivDem"><![CDATA[39]]></field>
 
   <field name="Sem_LivDem"><![CDATA[39]]></field>
  <field name="Date_LivConf"><![CDATA[20170301]]></field>
+
    <span style="color:red"><field name="Date_LivConf"><![CDATA[20181020]]></field></span>
  <field name="Sem_LivConf"><![CDATA[39]]></field>
 
  </line>
 
  <line name="info_article">
 
  <field name="Num_Ligne"><![CDATA[00001]]></field>
 
  <field name="Type_Ligne"><![CDATA[R]]></field>
 
  <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
  <field name="GTIN_Taille_Echantillon"><![CDATA[03789456062585]]></field>
 
  </line>
 
  <line name="info_remise">
 
  <field name="Remise_Totale_Ligne"><![CDATA[5]]></field>
 
  </line>
 
  <line name="tailles_1">
 
  <field name="Qte"><![CDATA[20]]></field>
 
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
  <line name="tailles_2">
 
  <field name="Qte"><![CDATA[2]]></field>
 
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
</group>
 
<group name="Article">
 
  <line name="info_livraison">
 
  <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
 
  <field name="Sem_LivDem"><![CDATA[39]]></field>
 
  <field name="Date_LivConf"><![CDATA[20181020]]></field>
 
 
   <field name="Sem_LivConf"><![CDATA[39]]></field>
 
   <field name="Sem_LivConf"><![CDATA[39]]></field>
 
   </line>
 
   </line>
 
   <line name="info_article">
 
   <line name="info_article">
  <field name="Num_Ligne"><![CDATA[00001]]></field>
 
  <field name="Type_Ligne"><![CDATA[R]]></field>
 
 
   <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
   <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
  <field name="GTIN_Taille_Echantillon"><![CDATA[03789456062585]]></field>
 
 
   </line>
 
   </line>
   <line name="info_remise">
+
   <span style="color:green"><line name="info_remise"><field name="Remise_Totale_Ligne"><![CDATA[5]]></field>
  <field name="Remise_Totale_Ligne"><![CDATA[5]]></field>
 
 
   </line>
 
   </line>
 
   <line name="info_compo">
 
   <line name="info_compo">
 
   <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 
   <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
   </line>
+
   </line></span>
 
   <line name="tailles_1">
 
   <line name="tailles_1">
 
   <field name="Qte"><![CDATA[20]]></field>
 
   <field name="Qte"><![CDATA[20]]></field>
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
  <line name="tailles_2">
 
  <field name="Qte"><![CDATA[2]]></field>
 
 
   <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
   <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
   <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
   <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
Ligne 576 : Ligne 495 :
 
  <group name="Article">
 
  <group name="Article">
 
   <line name="info_article">
 
   <line name="info_article">
  <field name="Num_Ligne"><![CDATA[00001]]></field>
 
  <field name="Type_Ligne"><![CDATA[R]]></field>
 
 
   <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
   <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
  <field name="GTIN_Taille_Echantillon"><![CDATA[03789456062585]]></field>
 
 
   </line>
 
   </line>
   <line name="info_remise">
+
   <span style="color:green"><line name="info_remise">
 
   <field name="Remise_Totale_Ligne"><![CDATA[5,5]]></field>
 
   <field name="Remise_Totale_Ligne"><![CDATA[5,5]]></field>
 
   </line>
 
   </line>
 
   <line name="info_compo">
 
   <line name="info_compo">
 
   <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 
   <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
   </line>
+
   </line></span>
 
   <line name="tailles_1">
 
   <line name="tailles_1">
 
   <field name="Qte"><![CDATA[20]]></field>
 
   <field name="Qte"><![CDATA[20]]></field>
Ligne 598 : Ligne 514 :
 
   <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
 
   <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
 
   <field name="Sem_LivDem"><![CDATA[39]]></field>
 
   <field name="Sem_LivDem"><![CDATA[39]]></field>
  <field name="Date_LivConf"><![CDATA[20190101]]></field>
+
    <span style="color:red"><field name="Date_LivConf"><![CDATA[20190101]]></field></span>
 
   <field name="Sem_LivConf"><![CDATA[39]]></field>
 
   <field name="Sem_LivConf"><![CDATA[39]]></field>
 
   </line>
 
   </line>
 
   <line name="info_article">
 
   <line name="info_article">
  <field name="Num_Ligne"><![CDATA[00001]]></field>
 
  <field name="Type_Ligne"><![CDATA[R]]></field>
 
 
   <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
   <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
   <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
  <field name="GTIN_Taille_Echantillon"><![CDATA[03789456062585]]></field>
 
 
   </line>
 
   </line>
 
   <line name="info_compo">
 
   <line name="info_compo">
Ligne 613 : Ligne 526 :
 
   <line name="tailles_1">
 
   <line name="tailles_1">
 
   <field name="Qte"><![CDATA[20]]></field>
 
   <field name="Qte"><![CDATA[20]]></field>
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
  <line name="tailles_2">
 
  <field name="Qte"><![CDATA[2]]></field>
 
 
   <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
   <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
   <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
   <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
   </line>
 
   </line>
 
  </group>
 
  </group>
<group name="Article">
 
  <line name="info_article">
 
  <field name="Num_Ligne"><![CDATA[00001]]></field>
 
  <field name="Type_Ligne"><![CDATA[R]]></field>
 
  <field name="Reference"><![CDATA[HOLDEN734]]></field>
 
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 
  <field name="GTIN_Taille_Echantillon"><![CDATA[03789456062585]]></field>
 
  </line>
 
  <line name="tailles_1">
 
  <field name="Qte"><![CDATA[20]]></field>
 
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
  </line>
 
  <line name="tailles_2">
 
  <field name="Qte"><![CDATA[2]]></field>
 
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
 
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 
  </line>
 
</group>
 
 
 
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  version="2.0" exclude-result-prefixes="xsl xs">
 
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
 
<xsl:template match="/doc/page">
 
<page>
 
<!-- traiter tous les noeuds sauf les group name='Article' (ils seront tous recopiés en l'état grâce au dernier template ci-dessous) -->
 
<xsl:apply-templates select="*[not(self::group[@name='Article'])]"/>
 
<!-- traiter les noeuds group Article en les triant en fonction de la date de livraison confirmée (c'est un tri sur une chaîne de caractères, on pourrait trier sur la semaine de livraison, confirmée ou demandée, ...) -->
 
<xsl:apply-templates select="group[@name='Article']">
 
<xsl:sort select="line[@name='info_livraison']/field[@name='Date_LivConf']" data-type="text" order="ascending"/>
 
</xsl:apply-templates>
 
</page>
 
</xsl:template>
 
  
<!-- cas des noeuds group Article -->
+
</translate>
<xsl:template match="group[@name='Article']">
 
<!-- ajouter le noeud dans le document résultat puis traiter ses fils -->
 
<group name="Article">
 
<!-- Un noeud group est composé de lignes qu'on va ordonner dans l'ordre suivant : info-liraison, info_article, info_remise, info_compo, tailles croissantes -->
 
<!-- On ne recopie les infos de livraison que si la date de livraison confirmée de ce noeud n'est pas déjà apparue dans un noeud précédent (on va comparer l'info dans le noeud courant avec ./ et dans les noeuds précédents avec prededing-sibling) -->
 
<xsl:if test="not(preceding-sibling::group[@name='Article']/line[@name='info_livraison']/field[@name='Date_LivConf'] = ./line[@name='info_livraison']/field[@name='Date_LivConf'])">
 
<!-- recopier les infos de livraison -->
 
<xsl:apply-templates select="./line[@name='info_livraison']"/>
 
</xsl:if>
 
<!-- recopier les infos article -->
 
<xsl:apply-templates select="./line[@name='info_article']"/>
 
<!-- recopier les infos remise -->
 
<xsl:apply-templates select="./line[@name='info_remise']"/>
 
<!-- recopier les infos compo -->
 
<xsl:apply-templates select="./line[@name='info_compo']"/>
 
<!-- recopier les infos taille en recopiant ces lignes par nom de taille croissant -->
 
<xsl:apply-templates select="./line[starts-with(@name, 'tailles')]">
 
<xsl:sort select="@name" data-type="text" order="ascending"/>
 
</xsl:apply-templates>
 
</group>
 
</xsl:template>
 
 
<!-- copie basique des noeuds, attributs, commentaires -->
 
<xsl:template match="@*|*|comment()">
 
<xsl:copy>
 
<xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
 
</xsl:copy>
 
</xsl:template>
 
</xsl:stylesheet>
 

Version actuelle datée du 21 août 2020 à 22:36

Autres langues :
English • ‎français

Préambule

Cette documentation aborde des principes simples du XSLT. Mapping ne pourra en aucun cas faire le support des XSL réalisés par ses utilisateurs (clients ou partenaires). Cette documentation a uniquement pour but d'aider ses utilisateurs à profiter de cette fonctionnalité.

Principes

La suite Mapping Onyx permet l'utilisation des fonctionnalités XSLT, le but étant de modifier la structure d'un fichier XML en une autre.


Cette transformation peut être appelée soit directement et nativement dans Designer, ou soit nativement dans le moteur de règles via l'utilisation d'une "boite" du Workflow.

Cette nouvelle fonctionnalité propre à Onyx permet notamment la modification d'un flux XMLDRAW en un autre (voir détails dans le chapitre Avantages).

Avantages

Le principal avantage de cette nouvelle fonctionnalité est la possibilité de traiter un flux générique en entrée tout en gardant un flux de sortie personnalisé.

D'une manière très simple, Onyx offre la possibilité de modifier le flux en entrée de Mapping sans devoir retoucher le programme générant ce même flux. Il est alors très simplement possible pour un ou plusieurs documents donnés de (liste non exhaustive) :

  1. Filtrer des informations
  2. Trier les lignes d'un tableau
  3. Gérer les veuves et orphelines (bloc de lignes devant être obligatoirement sur une même page)
  4. Ajouter des informations pour simplifier la conception
  5. Réaliser des conversions de formats de dates

Appels

Il existe 2 façons d'appeler les feuilles XSL :

Workflow

Pour appeler le XSL dans le moteur de règles Mapping (Workflow), il faut utiliser une boite Workflow de type CMD et appeler le programme M-XSLTransform en utilisant la commande suivante :

[%PATH_BIN%]/M-XSLTransform "[%MAP_FILE_IN%]" "[%PATH_XSL%]/MaFeuilleXSL.xsl" "[%MAP_FILE_OUT%]"

Liste des variables :
- PATH_BIN : chemin du répertoire des binaires Mapping. (Répertoire Applications sur Onyx Windows ou Bin sur Onyx Linux)
- PATH_XSL : chemin du répertoire contenant les feuilles XSL.
- MAP_FILE_IN : chemin + nom du fichier d'entrée de la "boite" du workflow
- MAP_FILE_OUT : chemin + nom du fichier de sortie de la "boite" du workflow

Designer

Il est également possible d'appeler des feuilles de transformation XSL directement dans Designer. Le gros avantage par rapport aux appels dans le Workflow est l'aspect intégration native dans Designer. En effet, la feuille XSL permet de personnaliser le document (tri sur les lignes, suppression de lignes, ajout de ligne, gestion des veuves et orphelines, etc.) et fait alors partie intégrante du projet Designer

Pour ce faire, il faut saisir le contenu de la feuille XSL dans la fenêtre de saisie accessible via le bouton Prétraitement XML de Designer encapsulé par #xsltransform; et #endxsltransform;

Syntaxe :
#xsltransform;
//Contenu de la feuille de XSL
#endxsltransform;


Exemples de feuilles de style XSL

Etant donné que nous partons généralement d'un flux XMLDRAW vers un autre flux XMLDRAW, il est possible de créer des exemples de templates XSL ayant chacun une ou plusieurs fonctionnalités bien spécifiques :

Pour structurer la suite de cette documentation, nous allons partir d'un exemple simple recopiant simplement le flux d'entrée. Dans les exemples qui suivront, nous allons mettre en avant les différences par rapport à cet exemple "coquille générique" afin d'arriver aux résultats souhaités.

Coquille générique : Simple copie du flux d'entrée

Cet exemple n'a pas de fonction en tant que telle (car il n'est pas utile d'appliquer un traitement XSL si on applique aucune modification aux flux de données) mais sera utilisé par tous les autres exemples qui suivront comme flux générique commun à tous les exemples.

 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">

  <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
  <xsl:template match="@*|*|comment()">
    <xsl:copy>
      <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Bon à savoir :
Entete de la feuille XSL
template de simple recopie

Supprimer des types de ligne dans un groupe

Cet exemple permet de supprimer les types de lignes info_remise et info_compo de tous les groupes article du document.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs 
fn">
 <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>

 <xsl:template match="/doc/page/group[@name='Article']/line[@name='info_remise']"/> 
 <xsl:template match="/doc/page/group[@name='Article']/line[@name='info_compo']"/> 

 <xsl:template match="@*|*|comment()">
  <xsl:copy>
   <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

Ajouter une première ligne et une dernière ligne dans un groupe

Sur tous les groupes

Cet exemple permet d'ajouter une ligne de début (first_line) et une ligne de fin (last_line) sur tous les groupes du flux d'entrée.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
 <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
 <xsl:template match="group">
       <xsl:copy>
           <xsl:apply-templates select="@*"/>
           <line name="first_line"/>
           <xsl:apply-templates/>
           <line name="last_line"/>
       </xsl:copy>
 </xsl:template> 
 <xsl:template match="@*|*|comment()">
     <xsl:copy>
       <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
     </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

Sur un groupe spécifique : Article

Cet exemple permet d'ajouter une ligne de début (first_line) et une ligne de fin (last_line) uniquement sur le ou les groupes Article du flux d'entrée.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
 <xsl:template match="group[@name='Article']">
       <group name="Article">
           <line name="first_line"/>
           <xsl:apply-templates/>
           <line name="last_line"/>
       </group>
   </xsl:template>
   <xsl:template match="@*|*|comment()">
     <xsl:copy>
      <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
     </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

Supprimer tous les groupes : group1

Cet exemple permet de supprimer tous les groupes group1 (présents sous /doc/page) du flux d'entrée.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs fn">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
<xsl:template match="/doc/page/group[@name='group1']"/> 
   <xsl:template match="@*|*|comment()">
     <xsl:copy>
      <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
     </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

Trier les lignes du groupe group1 par ordre décroissant

Cet exemple permet de trier toutes les lignes du groupe group1 du flux d'entrée par ordre décroissant de valeur de l'attribut name.

Feuille XSL :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0" exclude-result-prefixes="xsl fo xs 
fn">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
<xsl:template match="/doc/page/group[@name='group1']">
 <xsl:copy>
  <xsl:apply-templates select="@*"/>
    <xsl:apply-templates>
     <xsl:sort select="./@name" data-type="text" order="descending"/>
  </xsl:apply-templates>
 </xsl:copy>
 </xsl:template> 
   <xsl:template match="@*|*|comment()">
     <xsl:copy>
      <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
     </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

Exemple de XML en entrée :

<doc>
<page>
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
<group name="group1">
<line name="line1">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
<line name="line2">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
<line name="line3">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
</group>
<group name="group2">
<line name="line1">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
<line name="line2">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
</group>
</page>
</doc>

Flux généré en sortie :

<?xml version="1.0" encoding="utf-8"?>
<doc>
<page>
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
<group name="group1">
<line name="line3">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
<line name="line2">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
<line name="line1">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
</group>
<group name="group2">
<line name="line1">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
<line name="line2">
<field name="field1">ValueField1</field>
<field name="field2">ValueField2</field>
</line>
</page>
</doc>

Tri, réagencement, regroupement de lignes

Cet exemple permet de :
- Trier les lignes info_livraison des groupes Article par ordre alphabétique croissant de valeur du champs Date_LivConf
- Afficher les autres lignes du groupe Article dans un certain ordre : Info_livraison puis info_article puis info_remise puis info_compo et en dernier toutes les lignes commençant par la valeur tailles
- Ecrire la ligne info_livraison uniquement si la valeur de son champ date_LivConf est différent de la ligne info_livraison précédente

Feuille XSL :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"  version="2.0" exclude-result- 
prefixes="xsl xs">
 <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no" cdata-section-elements="field"/>
  <xsl:template match="/doc/page">
   <page>
    <xsl:apply-templates select="*[not(self::group[@name='Article'])]"/>
    <xsl:apply-templates select="group[@name='Article']">
     <xsl:sort select="line[@name='info_livraison']/field[@name='Date_LivConf']" data-type="text" order="ascending"/>
    </xsl:apply-templates>
   </page>
  </xsl:template>
  <xsl:template match="group[@name='Article']">
   <group name="Article">			
     <xsl:if test="not(preceding-sibling::group[@name='Article']/line[@name='info_livraison']/field[@name='Date_LivConf'] = 
./line[@name='info_livraison']/field[@name='Date_LivConf'])">
      <xsl:apply-templates select="./line[@name='info_livraison']"/>
    </xsl:if>
    <xsl:apply-templates select="./line[@name='info_article']"/>
    <xsl:apply-templates select="./line[@name='info_remise']"/>
    <xsl:apply-templates select="./line[@name='info_compo']"/>
    <xsl:apply-templates select="./line[starts-with(@name, 'tailles')]">
    <xsl:sort select="@name" data-type="text" order="ascending"/>
    </xsl:apply-templates>
   </group>
  </xsl:template>
  <xsl:template match="@*|*|comment()">
   <xsl:copy>
    <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
   </xsl:copy>
  </xsl:template>
</xsl:stylesheet>


Exemple de XML en entrée (uniquement les groupes Article pour simplifier la lisibilité du document) :

<group name="Article">
 <line name="info_livraison">
  <field name="Date_LivDem">2ème Qz Septembre 2014</field>
  <field name="Sem_LivDem">39</field>
   <field name="Date_LivConf">20181020</field>                   //la ligne de ce champs sera triée par valeur de Date_LivConf
  <field name="Sem_LivConf">39</field>
 </line>
 <line name="info_article">
  <field name="Reference">HOLDEN734</field>
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 </line>
 //Ces 2 lignes seront interverties car le template XSL fait afficher la ligne info_remise avant la ligne 
info_compo
  <line name="info_compo">
  <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 </line>
 <line name="info_remise">
  <field name="Remise_Totale_Ligne">5</field>
 </line>
 <line name="tailles_1">
  <field name="Qte">20</field>
  <field name="Unt_Oeuvre">U</field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
</group>
<group name="Article">
//Cette ligne ne sera pas affichée car la valeur de Date_LivConf de la ligne info_livraison précédente est la même 
(20181020)
 <line name="info_livraison">
  <field name="Date_LivDem">2ème Qz Septembre 2014</field>
  <field name="Sem_LivDem">39</field>
  <field name="Date_LivConf">20181020</field>
  <field name="Sem_LivConf">39</field>
 </line>
 <line name="info_article">
  <field name="Reference">HOLDEN734</field>
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 </line>
 //Ces 2 lignes seront interverties car le template XSL fait afficher la ligne info_remise avant la ligne 
info_compo
 <line name="info_compo">
  <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 </line>
 <line name="info_remise">
  <field name="Remise_Totale_Ligne">5,5</field>
 </line>
 <line name="tailles_1">
  <field name="Qte">20</field>
  <field name="Unt_Oeuvre">U</field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
</group>
<group name="Article">
 <line name="info_livraison">
  <field name="Date_LivDem">2ème Qz Septembre 2014</field>
  <field name="Sem_LivDem">39</field>
   <field name="Date_LivConf">20190101</field>                   //la ligne de ce champs sera triée par valeur de 
Date_LivConf
  <field name="Sem_LivConf">39</field>
 </line>
 <line name="info_article">
  <field name="Reference">HOLDEN734</field>
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 </line>
 <line name="info_compo">
  <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 </line>
 <line name="tailles_1">
  <field name="Qte">20</field>
  <field name="Unt_Oeuvre">U</field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
</group>
<group name="Article">
 <line name="info_livraison">
  <field name="Date_LivDem">2ème Qz Septembre 2014</field>
  <field name="Sem_LivDem">39</field>
  <field name="Date_LivConf">20160101</field>                   //la ligne de ce champs sera triée par valeur de 
Date_LivConf
  <field name="Sem_LivConf">39</field>
 </line>  
 <line name="info_article">
  <field name="Reference">HOLDEN734</field>
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 </line>
 <line name="info_compo">
  <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 </line>
 <line name="tailles_1">
  <field name="Qte">20</field>
  <field name="Unt_Oeuvre">U</field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
 <line name="tailles_2">
  <field name="Qte">2</field>
  <field name="Unt_Oeuvre">U</field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
</group>


XML généré (uniquement les groupes Article pour simplifier la lisibilité du document) :

<group name="Article">
 <line name="info_livraison">
  <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
  <field name="Sem_LivDem"><![CDATA[39]]></field>
   <field name="Date_LivConf"><![CDATA[20160101]]></field>
  <field name="Sem_LivConf"><![CDATA[39]]></field>
 </line>
 <line name="info_article">
  <field name="Reference"><![CDATA[HOLDEN734]]></field>
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 </line>
 <line name="info_compo">
  <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 </line>
 <line name="tailles_1">
  <field name="Qte"><![CDATA[20]]></field>
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
 <line name="tailles_2">
  <field name="Qte"><![CDATA[2]]></field>
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
</group>
<group name="Article">
 <line name="info_livraison">
  <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
  <field name="Sem_LivDem"><![CDATA[39]]></field>
   <field name="Date_LivConf"><![CDATA[20181020]]></field>
  <field name="Sem_LivConf"><![CDATA[39]]></field>
 </line>
 <line name="info_article">
  <field name="Reference"><![CDATA[HOLDEN734]]></field>
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 </line>
 <line name="info_remise"><field name="Remise_Totale_Ligne"><![CDATA[5]]></field>
 </line>
 <line name="info_compo">
  <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 </line>
 <line name="tailles_1">
  <field name="Qte"><![CDATA[20]]></field>
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
</group>
<group name="Article">
 <line name="info_article">
  <field name="Reference"><![CDATA[HOLDEN734]]></field>
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 </line>
 <line name="info_remise">
  <field name="Remise_Totale_Ligne"><![CDATA[5,5]]></field>
 </line>
 <line name="info_compo">
  <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 </line>
 <line name="tailles_1">
  <field name="Qte"><![CDATA[20]]></field>
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
</group>
<group name="Article">
 <line name="info_livraison">
  <field name="Date_LivDem"><![CDATA[2ème Qz Septembre 2014]]></field>
  <field name="Sem_LivDem"><![CDATA[39]]></field>
   <field name="Date_LivConf"><![CDATA[20190101]]></field>
  <field name="Sem_LivConf"><![CDATA[39]]></field>
 </line>
 <line name="info_article">
  <field name="Reference"><![CDATA[HOLDEN734]]></field>
  <field name="Designation"><![CDATA[HOLDEN Blanc]]></field>
 </line>
 <line name="info_compo">
  <field name="Composition"><![CDATA[98% Polyester-2% Coton]]></field>
 </line>
 <line name="tailles_1">
  <field name="Qte"><![CDATA[20]]></field>
  <field name="Unt_Oeuvre"><![CDATA[U]]></field>
  <field name="Lib_Unt_Oeuvre"><![CDATA[Unité(s)]]></field>
 </line>
</group>