UP PREVIOUS NEXT   Technologies Internet et Education, © TECFA
  5. Les outils de base du framework XML

5. Les outils de base du framework XML

5.1 Xpath: identification de fragments

 

    <xsl:apply-templates select="title"/>
    <xsl:apply-templates select="tc-courses/tc-course[position()=1]/course-module[position()=2]"/>

 

5.2 Assemblage d'un structure XML à partir de plusieurs arbres

A. Avec des entités XML

<!ENTITY pm "Patrick Mendelsohn">
<!ENTITY acirc  "&#194;">
<!ENTITY espace "&#160;">
<!ENTITY copyright "&#xA9;">
<!ENTITY explication SYSTEM "citation.xml">

Ensuite, on fait une référence du style "&nom_paramètre;":

<para> &pm; sort du ch&acirc;teau <para>
<para>Il lit &explication </para>

va donner:

<para> Patrick Mendelsohn sort du ch&acirc;teau<para>
<para> Il lit: 
       <citation> blabla bla </citation>   
      <!-- (le contenu du fichier citation.xml -->
</para>
 

B. Xinclude: un langage pour inclure des fragments XML

 
<page xmlns:xinclude
="http://www.w3.org/1999/XML/xinclude">
 <include xinclude:parse
="xml" xinclude:href
="proj/proj1/info.xml"/>
<specification>
  <include xinclude:parse
="xml" xinclude:href
="proj/proj1/ specification.xml#xpointer(//specification/evaluation)"/>
</specification>
.....
   <include xinclude:parse="xml" xinclude:href="proj/proj12/info.xml"/>
......
</page>
 

C. Server-side

5.3 XSLT: un langage pour transformations

Principe de fonctionnement de XSLT
XML vers HTML
<commentaire> xxxx </commentaire>

pourrait donner:

<DL>
     <DT>Commentaire  </DT>
     <DD> xxxx </DD>
 </DL>
Structure d'une règle (template) XSLT:

 

Définition d'un "template" avec xsl:template

Exemple 5-1: Une simple règle XSLT (XML vers HTML)

  <xsl:template match="project//title">
   <h1 align="center"> <xsl:apply-templates/>
 </h1>
  </xsl:template>
Anatomie d'un simple style sheet

 

5.4 XSLT Patterns de base (A LIRE SOI-MEME)

A. <xsl:apply-templates />

 <xsl:template match="/">
    <html> <body>
      <xsl:apply-templates/>
    </body> </html>
  </xsl:template>

B. L'attribut "select" de apply-templates

<xsl:template match="page">
  <xsl:apply-templates select="title"/>
</xsl:template>

Cette règle pourrait s'appliquer au texte XML suivant:

C. Extraction d'une valeur

xsl:value-of
  • Sélectionne le contenu d'un élément et le copie vers le document "sortie"
  • Autrement dit: extraction d'un seul sous-élément (ou sous-attribut)
  • Utilisé souvent pour remplir des tables de toutes sortes
  • La règle suivante se déclenche dès qu'une balise <projet> est retrouvée et insère dans le document sortie le contenu de l'élément <title> qui se trouve à l'intérieur d'un sous-élément <problem>
<xsl:template match="project">
    <P>
      <xsl:value-of select="problem/title"/>
    </P>
  </xsl:template>

Syntaxe spéciale pour insérer la valeur d'un objet dans un string d'attribut utilisé dans l'output d'un template: {....}

<xsl:template match="contact-info">
....
  <a href="mailto:{@email}"><xsl:value-of select="@email"/></a>
...

D. xsl:copy

  <xsl:template match="p">
   <xsl:copy> <xsl:apply-templates/> </xsl:copy>
  </xsl:template>
<xsl:template match="*">
   <xsl:copy>Garbage: <i> <xsl:apply-templates/> </i> </xsl:copy>
  </xsl:template>

E. <xsl:if>

Exemple 5-2: xsl:if exemple pour insérer des virgules dans une liste

<xsl:template match="animal">
  Nom:<xsl:value-or select="@name"/>
  <br> Couleurs:
   <xsl:value-of select="couleur"/>
   <xsl:if test="position()!=last()">, </xsl:if>
</xsl:template>

XML:

<animal name="zebre"> <couleur>noir</couleur> <couleur>blanc</couleur> <couleur>bleu</couleur> </animal>

Résultat:

       Nom: zebre 
       Couleur: noir, blanc, bleu

F. <xsl:choose>

<xsl:template match="animal">
  <xsl:choose>
    <xsl:when test="@couleur='noir'">
      <P style="color:black">
        <xsl:value-of select="."/>
      </P>
    </xsl:when>
    <xsl:when test="@couleur='bleu'">
      <P style="color:blue">
        <xsl:value-of select="."/>
      </P>
    </xsl:when>
    <xsl:when test="pattern">
	      ...
    </xsl:when>
    <xsl:otherwise>
      <P style="color:green">
        <xsl:value-of select="."/>
      </P>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
 

G. <xsl:for-each>

Exemple 5-3: Présentation du résultat XML d'une requête SQL avec XSLT

<xsl:template match="ROWSET">
    <table border="2" cellspacing="1" cellpadding="6">
     <xsl:for-each select="ROW">  <tr>
      <td><xsl:value-of select="id"/></td>
      <td><xsl:value-of select="login"/></td>
      <td><xsl:value-of select="fullname"/></td>
        <td bgcolor="tan"><a href="{url}"><xsl:value-of select="url"/></a></td>
      <td><xsl:value-of select="food"/></td>
      <td><xsl:value-of select="work"/></td>
      <td><xsl:value-of select="love"/></td>
      <td><xsl:value-of select="leisure"/></td>
      </tr> </xsl:for-each>
    </table>	
</xsl:template>
 

5.5 XSL-FO: un langage pour la mise en page

Spécification de XSL
But
Usage

(FO est du XML avec XSL-FO mélange)

Statut

A. XSLFO minimaliste

Exemple 5-4: Un petit exemple XML + XSLT + XSLFO complet

Source XML
<page>
 <title>Hello Apache/FOP and Apache/Cocoon friends</title>
<content>
Here is some content. It should work with FOP 0.18 (and hopefully above).
It is totally uninteresting. It is totally uninteresting. ... </content> 
<content>
   Here is some more content.
   It is slightly uninteresting.  .... :)
</content> 
<comment>Written by DKS/Tecfa 6/01</comment>
</page>
Feuille de style XSL/FO
<?xml version="1.0"?>
 
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0" >
 
 
 
 
 
<!-- rule for the whole document: root element is page -->
<xsl:template match="page">
 <fo:root>
  <fo:layout-master-set>
  <!-- Definition of a single master page. It is simple (no headers etc.) -->
  <fo:simple-page-master 
			 master-name="first
" 
			 margin-left="2cm"  margin-right="2cm"
			 margin-bottom="0.5cm" margin-top="0.75cm"
			 page-width="21cm" page-height="29.7cm"
			 >
 
   <!-- required element body -->
   <fo:region-body/>
  </fo:simple-page-master>
 </fo:layout-master-set>
  
 <!-- Definition of a page sequence -->
 <fo:page-sequence 
master-name="first">
  <fo:flow 
flow-name="xsl-region-body"
 font-size="14pt" line-height="14pt">
    <xsl:apply-templates/>
  </fo:flow>  
 </fo:page-sequence> 
</fo:root>
</xsl:template>
 
 
 
<!-- A series of XSLT rules that produce fo:blocks to be inserted above -->
 
 <xsl:template match="page/title">
    <fo:block font-size="36pt" text-align="center" line-height="40pt" space-before="0.5cm" space-after="1.0cm">
    <xsl:apply-templates/></fo:block>
  </xsl:template>
 
 <xsl:template match="content">
    <fo:block text-align="justify"  space-before="0.5cm">
    <xsl:apply-templates/></fo:block>
  </xsl:template>
 
 <xsl:template match="comment">
    <fo:block font-size="12pt" text-align="start" space-before="0.7cm" font-style="italic">
    <xsl:apply-templates/></fo:block>
  </xsl:template>
 
</xsl:stylesheet>

 

Sequelette XSL-T/FO de base
<xsl:template match="page">
 <fo:root>
  <fo:layout-master-set>
 
  <!-- Definition of a single master page. It is simple (no headers etc.) -->
  <fo:simple-page-master 
			 master-name="first
"  >
   <!-- required element body -->
   <fo:region-body/>
  </fo:simple-page-master>
 </fo:layout-master-set>
  
 <!-- Definition of a page sequence -->
 <fo:page-sequence 
master-name="first">
  <fo:flow 
flow-name="xsl-region-body"
 font-size="14pt" line-height="14pt">
    <xsl:apply-templates/>
  </fo:flow>  
 </fo:page-sequence> 
</fo:root>
</xsl:template>
 
 
  • Une règle XSLT qui définit la racine FO pour la racine XML
Architecture de la racine FO

Sous la racine fo:root il y a toujours:

  1. un fo:layout-master-set
    • qui définit un ou plusieurs page layouts définis avec fo:simple-page-master
    • qui peut définir des combinaisons de page layouts (page sequence masters)
  2. des déclarations à option fo:declarations
  3. une sequénce plusieurs séquences de flux de texte
    • fo:page-sequences qui contiennent du texte (litéralement ou fournis par XSLT) et des instructions de formattage.

B. On peut faire plus sophistiqué

Exemple d'un layout de type "livre"
</fo:layout-master-set>
.......
		<fo:page-sequence-master
 master-name="run">
			<fo:repeatable-page-master-alternatives
 maximum-repeats="no-limit" >
				<fo:conditional-page-master-reference
					master-name="left"
					odd-or-even="even" />
				<fo:conditional-page-master-reference
					master-name="right"
					odd-or-even="odd" />
				<fo:conditional-page-master-reference
					master-name="title"
					 />
			</fo:repeatable-page-master-alternatives>
   </fo:page-sequence-master>
Contenus statiques
<fo:static-content
 flow-name="xsl-region-before
">
     <fo:block text-align="end" font-size="10pt" font-family="serif" line-height="14pt" color="red" > Atelier Webmaster <fo:page-number/> </fo:block>
   </fo:static-content>
 

C. Formattage des blocs

Exemple 5-5: Formattage CSS vs. XSL

CSS:

page > title {
		display: block;
		text-align: center; line-height: 40pt; ....
}

XSLT/FO:

 <xsl:template match="page/title">
    <fo:block 	font-size="36pt" text-align="center" 
				line-height="40pt" space-before="0.5cm" 
				space-after="1.0cm">
    <xsl:apply-templates/></fo:block>
  </xsl:template>
 

FO simple:

 <fo:block 	font-size="36pt" text-align="center" 
				line-height="40pt" space-before="0.5cm" 
				space-after="1.0cm">
Hello Apache/FOP and Apache/Cocoon friends
</fo:block>

UP PREVIOUS NEXT -- TIE