1 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
Exemple dutilisation de la fonction document() :
Nous reprenons les documents Fabienne.xml et ClementEspNom.xml que nous avions utilisés au chapitre 061 Intégration pour produire le document ToutesCritiques.xml qui intégrait les documents Fabienne.xml et ClementEspNom2.xml. Nous avions dû faire appel à des import, un pour Fabienne.xsl et un autre pour ClementEspNom.xsl qui traitait un espace de nom. Si vous ne vous rappelez pas la situation, allez voir ce chapitre à la page 11. De toute façon voici les documents utilisés :
Fabienne.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<critiq>
<auteur>Fabienne Dupont</auteur>
<film titre="Vertigo" note="2">J'ai bien aimé.</film>
<film titre="Sleepy Hollow" note="1">Je n'ai vraiment pas aimé.</film>
</critiq>
ClementEspNom.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<film xmlns="http://clement-dupont.fr/">
<titre>Vertigo</titre>
<note>10</note>
<critique>C'est un excellent film.</critique>
</film>
Au départ de ces deux documents, nous souhaitons obtenir le document ToutesCritiquesEspNom.xml qui sera conforme à ToutesCritiquesEspNom.dtd :
ToutesCritiquesEspNom.dtd
<!ELEMENT critiques (critique)+>
<!ELEMENT critique (auteur, film, contenu)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT film (#PCDATA)>
<!ELEMENT contenu (#PCDATA)>
<!ATTLIST critique note CDATA #REQUIRED>
Au chapitre 061 Integration nous avion produit le document :
ToutesCritiquesEspNom.xml
<?xml version="1.0" encoding="iso-8859-1"?>
< !DOCTYPE critiques SYSTEM "ToutesCritiquesEspNom.dtd">
<critiques>
<critique note="10">
<auteur>Clément Dupont</auteur>
<film>Vertigo</film>
<contenu>C'est un excellent film.</contenu>
</critique>
<critique note="7">
<auteur>Fabienne Dupont</auteur>
<film>Vertigo</film>
<contenu>J'ai bien aimé.</contenu>
</critique>
<critique note="3">
<auteur>Fabienne Dupont</auteur>
<film>Sleepy Hollow</film>
<contenu>Je n'ai vraiment pas aimé.</contenu>
</critique>
</critiques>
Pour cela, nous avions créé le document
CritiquesEspNom.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE critiques [
<!ENTITY source1 SYSTEM "ClementEspNom.xml">
<!ENTITY source2 SYSTEM "Fabienne.xml">
]>
<critiques>
&source1;
&source2;
</critiques>
auquel nous avions appliqué la feuille
ToutesCritiquesEspNom.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="ClementEspNom.xsl"/>
<xsl:import href="Fabienne.xsl"/>
<xsl:output method="xml" encoding="iso-8859-1" indent="yes"
doctype-system="ToutesCritiquesEspNom.dtd" />
<xsl:template match="critiques">
<critiques>
<xsl:apply-templates select="*"/>
</critiques>
</xsl:template>
</xsl:stylesheet>
qui « importait » les documents Fabienne.xsl et ClementEspNom.xsl ci-dessous :
Fabienne.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="iso-8859-1" indent="yes"/>
<xsl:template match="critiq">
<xsl:apply-templates select="film"/>
</xsl:template>
<xsl:template match="film">
<critique note="{round((@note*10) div 3)}">
<auteur><xsl:value-of select="../auteur"/></auteur>
<film><xsl:value-of select="@titre"/></film>
<contenu><xsl:value-of select="text()"/></contenu>
</critique>
</xsl:template>
<!--pour ne pas insérer le nom de l'auteur une deuxième fois-->
<xsl:template match="auteur"/>
</xsl:stylesheet>
ClementEspNom.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://clement-dupont.fr/"
exclude-result-prefixes="ext">
<xsl:output method="xml" encoding="iso-8859-1" indent="yes"/>
<xsl:template match="ext:film">
<critique note="{ext:note}">
<auteur>Clément Dupont</auteur>
<film><xsl:value-of select="ext:titre"/></film>
<contenu><xsl:value-of select="ext:critique"/></contenu>
</critique>
</xsl:template>
</xsl:stylesheet>
Au lieu de cela nous allons, maintenant, utiliser la fonction document() pour analyser un deuxième document, Fabienne.xml p.ex, pendant lapplication de la feuille ToutesCritiquesEspNom.xsl à ClementEspNom.xml.
Voici la nouvelle version de ToutesCritiquesEspNom.xsl renommée pour loccasion ToutesCritiquesEspNomDoc.xsl :
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://clement-dupont.fr/"
exclude-result-prefixes="ext">
<xsl:import href="ClementEspNom.xsl"/>
<!--xsl:import href="Fabienne.xsl"/-->
<xsl:output method="xml" encoding="iso-8859-1" indent="yes"
doctype-system="ToutesCritiquesEspNom.dtd"/>
<xsl:template match="/">
<critiques>
<xsl:apply-templates select="ext:film"/>
<xsl:variable name="nomFich" select="document('Fabienne.xml')"/>
<xsl:apply-templates select="$nomFich/critiq/film"/>
</critiques>
</xsl:template>
<xsl:template match="film">
<critique note="{round((@note*10) div 3)}">
<auteur><xsl:value-of select="../auteur"/></auteur>
<film><xsl:value-of select="@titre"/></film>
<contenu><xsl:value-of select="text()"/></contenu>
</critique>
</xsl:template>
</xsl:stylesheet>
Nous avons mis en gras les points importants.
Nous avons supprimé limport de Fabienne.xsl,
Nous avons assigné à la variable nomFich le résultat de la fonction document(), la racine de larbre du document Fabienne.xml, et nous avons lancé un apply-templates avec les données nécessaires pour le traitement du document Fabienne.xml. Cest la règle « film » qui effectue le traitement.
En fait la fonction document() renvoie la racine de larbre du document qui lui est passé par paramètre. Une fois la racine connue, les chemins XPath fonctionnent comme ailleurs. |
Partager