I. Introduction▲
L'objectif de ce tutoriel est de montrer comment la technologie XML permet d'échanger des données de commande et de devis entre un client et des soumissionnaires.
On devra donc dans un premier temps définir les schémas des fichiers XML commandes et devis. Ensuite on réalisera pour chaque fichier un petit script grâce à la technologie XSLT afin de présenter automatiquement les données dans un tableau HTML
II. Les schémas▲
Nous décrirons les deux fichiers Commande et Devis selon le format de description XSD (Xml Shema Definition).
II-A. Schéma de la commande▲
commande.xsd :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
<?xml version="1.0" encoding="UTF-8"?>
<
xs
:
schema
xmlns
:
xs
=
"http://www.w3.org/2001/XMLSchema"
elementFormDefault
=
"qualified"
attributeFormDefault
=
"unqualified"
>
<
xs
:
element
name
=
"Produit"
>
<
xs
:
complexType>
<
xs
:
sequence>
<
xs
:
element
name
=
"denomination"
type
=
"xs:string"
/>
<
xs
:
element
name
=
"description"
type
=
"xs:string"
/>
</
xs
:
sequence>
<
xs
:
attribute
name
=
"refProduit"
type
=
"xs:ID"
use
=
"required"
/>
</
xs
:
complexType>
</
xs
:
element>
<
xs
:
element
name
=
"Agence"
>
<
xs
:
complexType>
<
xs
:
sequence>
<
xs
:
element
name
=
"nom"
type
=
"xs:string"
/>
<
xs
:
element
name
=
"adresse"
type
=
"xs:string"
/>
<
xs
:
element
name
=
"tel"
type
=
"xs:string"
/>
</
xs
:
sequence>
<
xs
:
attribute
name
=
"refAgence"
type
=
"xs:ID"
use
=
"required"
/>
</
xs
:
complexType>
</
xs
:
element>
<
xs
:
element
name
=
"Ligne"
>
<
xs
:
complexType>
<
xs
:
sequence>
<
xs
:
element
ref
=
"Agence"
/>
<
xs
:
element
ref
=
"Produit"
/>
<
xs
:
element
name
=
"quantite"
type
=
"xs:integer"
/>
</
xs
:
sequence>
</
xs
:
complexType>
</
xs
:
element>
<
xs
:
element
name
=
"Commande"
>
<
xs
:
complexType>
<
xs
:
sequence>
<
xs
:
element
ref
=
"Ligne"
maxOccurs
=
"unbounded"
/>
<
xs
:
attribute
name
=
"date"
type
=
"xs:date"
/>
</
xs
:
sequence>
</
xs
:
complexType>
</
xs
:
element>
</
xs
:
schema>
On voit que ce fichier définit une commande comme un ensemble de lignes. Chaque ligne se compose d'un produit, de la quantité demandée pour le produit et de l'identification de l'agence qui demande ce produit. Bien entendu, une commande est passée à une date donnée.
II-B. Schéma du devis▲
devis.xsd :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
<?xml version="1.0" encoding="UTF-8"?>
<
xs
:
schema
xmlns
:
xs
=
"http://www.w3.org/2001/XMLSchema"
elementFormDefault
=
"qualified"
attributeFormDefault
=
"unqualified"
>
<
xs
:
element
name
=
"Produit"
>
<
xs
:
complexType>
<
xs
:
sequence>
<
xs
:
element
name
=
"denomination"
type
=
"xs:string"
/>
<
xs
:
element
name
=
"description"
type
=
"xs:string"
/>
</
xs
:
sequence>
<
xs
:
attribute
name
=
"refProduit"
type
=
"xs:ID"
use
=
"required"
/>
</
xs
:
complexType>
</
xs
:
element>
<
xs
:
element
name
=
"Agence"
>
<
xs
:
complexType>
<
xs
:
sequence>
<
xs
:
element
name
=
"nom"
type
=
"xs:string"
/>
<
xs
:
element
name
=
"adresse"
type
=
"xs:string"
/>
<
xs
:
element
name
=
"tel"
type
=
"xs:string"
/>
</
xs
:
sequence>
<
xs
:
attribute
name
=
"refAgence"
type
=
"xs:ID"
use
=
"required"
/>
</
xs
:
complexType>
<
xs
:
element
name
=
"Fournisseur"
>
<
xs
:
complexType>
<
xs
:
sequence>
<
xs
:
element
name
=
"nom"
type
=
"xs:string"
/>
<
xs
:
element
name
=
"adresse"
type
=
"xs:string"
/>
<
xs
:
element
name
=
"tel"
type
=
"xs:string"
/>
</
xs
:
sequence>
<
xs
:
attribute
name
=
"refFournisseur"
type
=
"xs:ID"
use
=
"required"
/>
</
xs
:
complexType>
</
xs
:
element>
<
xs
:
element
name
=
"Ligne"
>
<
xs
:
complexType>
<
xs
:
sequence>
<
xs
:
element
ref
=
"Agence"
/>
<
xs
:
element
ref
=
"Fournisseur"
/>
<
xs
:
element
ref
=
"Produit"
/>
<
xs
:
element
name
=
"quantite"
type
=
"xs:integer"
/>
<
xs
:
element
name
=
"prix"
type
=
"xs:integer"
/>
</
xs
:
sequence>
</
xs
:
complexType>
</
xs
:
element>
<
xs
:
element
name
=
"Devis"
>
<
xs
:
complexType>
<
xs
:
sequence>
<
xs
:
element
ref
=
"Ligne"
maxOccurs
=
"unbounded"
/>
<
xs
:
attribute
name
=
"date"
type
=
"xs:date"
/>
</
xs
:
sequence>
</
xs
:
complexType>
</
xs
:
element>
</
xs
:
schema>
Le devis étant la réponse à la commande de la place de marché, le schéma sera le même que celui de la commande à ceci près que chaque ligne sera enrichie de l'identification du fournisseur et du prix proposé.
III. Scripts de visualisation▲
Ces fichiers XML devront être lus par des opérateurs de vente et d'achat de la place de marché des fournisseurs et du client. On doit donc pouvoir présenter ces fichiers de façon lisible dans un navigateur Internet. Pour cela nous utiliserons la technologie de transformation XSLT (Xml Stylesheet Language Transformation).
III-A. Transformation de la commande▲
On choisira de présenter dans un tableau les lignes de la commande permettant de visualiser l'agence, le produit et la quantité souhaitée.
commande.xsl :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
<?xml version="1.0" encoding="UTF-8"?>
<
xsl
:
stylesheet
version
=
"1.0"
xmlns
:
xsl
=
"http://www.w3.org/1999/XSL/Transform"
>
<
xsl
:
output
method
=
"html"
/>
<
xsl
:
template
match
=
"/"
>
<html>
<head>
<title>
Demande de proposition de prix via la place de marche
</title>
</head>
<body>
<p>
date :<
xsl
:
value-of
select
=
"Commande/date"
></
xsl
:
value-of>
</p>
<table
border
=
"2"
>
<tr>
<td>
Agence </td>
<td>
reference produit </td>
<td>
denomination </td>
<td>
description </td>
<td>
quantite </td>
</tr>
<
xsl
:
for-each
select
=
"Commande/Ligne"
>
<tr>
<td>
<
xsl
:
value-of
select
=
"Agence/nom"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"Produit/@refProduit"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"Produit/denomination"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"Produit/description"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"quantite"
></
xsl
:
value-of>
</td>
</tr>
</
xsl
:
for-each>
</table>
</body>
</html>
</
xsl
:
template>
</
xsl
:
stylesheet>
III-B. Transformation du devis▲
Comme pour le schéma, chaque ligne du devis ne sera enrichie que du nom du fournisseur et du prix proposé.
devis.xsl :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
<?xml version="1.0" encoding="UTF-8"?>
<
xsl
:
stylesheet
version
=
"1.0"
xmlns
:
xsl
=
"http://www.w3.org/1999/XSL/Transform"
>
<
xsl
:
output
method
=
"html"
/>
<
xsl
:
template
match
=
"/"
>
<html>
<head>
<title>
Gestion des commandes
</title>
</head>
<body>
<p>
date :<
xsl
:
value-of
select
=
"Devis/date"
></
xsl
:
value-of>
</p>
<table
border
=
"2"
>
<tr>
<td>
Agence </td>
<td>
Fournisseur </td>
<td>
adresse fournisseur </td>
<td>
reference produit </td>
<td>
denomination </td>
<td>
description </td>
<td>
quantite </td>
<td>
prix unitaire </td>
</tr>
<
xsl
:
for-each
select
=
"Devis/Ligne"
>
<tr>
<td>
<
xsl
:
value-of
select
=
"Agence/nom"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"Fournisseur/nom"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"Fournisseur/adresse"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"Produit/@refProduit"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"Produit/denomination"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"Produit/description"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"quantite"
></
xsl
:
value-of>
</td>
<td>
<
xsl
:
value-of
select
=
"prix"
></
xsl
:
value-of>
</td>
</tr>
</
xsl
:
for-each>
</table>
</body>
</html>
</
xsl
:
template>
</
xsl
:
stylesheet>
IV. Tests▲
Afin de vérifier le fonctionnement des scripts de transformation, il suffit d'écrire une commande et un devis au format XML qui respectent les schémas adoptés.
Je propose les deux fichiers suivants : commande.xml et devis.xml.
IV-A. Test de la commande▲
commande.xml :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="commande.xsl"?>
<Commande
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi
:
noNamespaceSchemaLocation
=
"commande.xsd"
>
<Ligne>
<Agence
refAgence
=
"2"
>
<nom>
marseille</nom>
<adresse>
3 place st charles 13000 marseille</adresse>
<tel>
0413258465</tel>
</Agence>
<Produit
refProduit
=
"125"
>
<denomination>
cle dynamometrique</denomination>
<description>
outil de serrage a couple parametrable</description>
</Produit>
<quantite>
1000</quantite>
</Ligne>
<Ligne>
<Agence
refAgence
=
"1"
>
<nom>
Paris</nom>
<adresse>
8 avenue du parc 75014 Paris</adresse>
<tel>
013825898</tel>
</Agence>
<Produit
refProduit
=
"312"
>
<denomination>
multimetre universel</denomination>
<description>
outil de mesure electrique</description>
</Produit>
<quantite>
200</quantite>
</Ligne>
<date>
2012-05-01</date>
</Commande>
Ce qui donne à la lecture avec Internet Explorer :
IV-B. Test du devis▲
devis.xml :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="devis.xsl"?>
<Devis
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi
:
noNamespaceSchemaLocation
=
"devis.xsd"
>
<Ligne>
<Agence
refAgence
=
"2"
>
<nom>
marseille</nom>
<adresse>
3 place st charles 13000 marseille</adresse>
<tel>
0413258465</tel>
</Agence>
<Fournisseur
refFournisseur
=
"216AZ"
>
<nom>
tool supply</nom>
<adresse>
2 rue renard 92000 nantere</adresse>
<tel>
0123456789</tel>
</Fournisseur>
<Produit
refProduit
=
"125"
>
<denomination>
cle dynamometrique</denomination>
<description>
outil de serrage a couple parametrable</description>
</Produit>
<quantite>
1000</quantite>
<prix>
17</prix>
</Ligne>
<Ligne>
<Agence
refAgence
=
"1"
>
<nom>
Paris</nom>
<adresse>
8 avenue du parc 75014 Paris</adresse>
<tel>
013825898</tel>
</Agence>
<Fournisseur
refFournisseur
=
"216AZ"
>
<nom>
93 provider</nom>
<adresse>
35 boulevard joffres 93000 Bobigny</adresse>
<tel>
0987465132</tel>
</Fournisseur>
<Produit
refProduit
=
"312"
>
<denomination>
multimetre universel</denomination>
<description>
outil de mesure electrique</description>
</Produit>
<quantite>
200</quantite>
<prix>
14</prix>
</Ligne>
<date>
2012-05-01</date>
</Devis>
Ce qui donne à la lecture avec Internet Explorer :
V. Conclusion▲
Cet article illustre comment la technologie XML permet d'opérer des échanges de données suivant des formats déterminés de façon simple et rapide.
Il permet également de constater la puissance de XSLT pour visualiser les données échangées.
Il est important de préciser que les transformations prenant comme source un fichier XML ne ciblent pas uniquement le format HTML, mais tous les médias possibles : PDF, WORD, EXCEL, bases de données, etc.