support-webinphp-kanouni-0058-02-26052014



Documents pareils
XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Thierry BOULANGER. par la pratique. Bases indispensables Concepts et cas pratiques XML. 3 ième édition. Nouvelle édition

BD et XML : Exercices

Master d Informatique Corrigé du partiel novembre 2010

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

Faculté de Génie Chaire industrielle en infrastructures de communication. La technologie XML. Wajdi Elleuch

Programmation des Applications Réparties. Parsers XML DOM et SAX

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

<?xml version="1.0" encoding="iso " standalone="yes"?>

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Programmation Web. Madalina Croitoru IUT Montpellier

Projet de programmation (IK3) : TP n 1 Correction

Chapitre 10. Les interfaces Comparable et Comparator 1

PHP 5.4 Développez un site web dynamique et interactif

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

OpenPaaS Le réseau social d'entreprise

as Architecture des Systèmes d Information

Production de documents avec XSLT. Production de documents p.1/??

Exercices sur SQL server 2000

Document Object Model (DOM)

Once the installation is complete, you can delete the temporary Zip files..

Programmation en Java IUT GEII (MC-II1) 1

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

PDO : PHP Data Object 1/13

WEB page builder and server for SCADA applications usable from a WEB navigator

Programmer en JAVA. par Tama

Utiliser une WebCam. Micro-ordinateurs, informations, idées, trucs et astuces

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

Premiers Pas en Programmation Objet : les Classes et les Objets

Design et implémentation d un logiciel de validation et de génération de configurations réseaux

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Algorithmique et Programmation, IMA

Paris Airports - Web API Airports Path finding

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Installation de VirtualPOPC-1 sur Ubuntu Server LTS 64bits

I. Programmation I. 1 Ecrire un programme en Scilab traduisant l organigramme montré ci-après (on pourra utiliser les annexes):

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

Instructions pour mettre à jour un HFFv2 v1.x.yy v2.0.00

Mysql avec EasyPhp. 1 er mars 2006

La base de données XML exist. A. Belaïd

Processus 2D-Doc. Version : 1.1 Date : 16/11/2012 Pôle Convergence AGENCE NATIONALE DES TITRES SECURISÉS. Processus 2D-Doc.

Programmation par les Objets en Java

BIRT (Business Intelligence and Reporting Tools)

Alfstore workflow framework Spécification technique

Une introduction à Java

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Java Licence Professionnelle CISII,

Plateforme PAYZEN. Définition de Web-services

Qu'est-ce que XML? XML : Extensible Markup Language. Exemple de document SGML SGML

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Recherche dans un tableau

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

4. SERVICES WEB REST 46

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Accès à l'information XML par des requêtes XQuery au travers de son XSchema

Optimiser les performances du mouvement de monte de l Axe Z.

TD3: tableaux avancées, première classe et chaînes

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Bases de programmation. Cours 5. Structurer les données

Ingénierie Dirigée par les Modèles. Editeurs de modèles. (Eclipse Modeling Tools) Jean-Philippe Babau

SQL Parser XML Xquery : Approche de détection des injections SQL

Chapitre IX. L intégration de données. Les entrepôts de données (Data Warehouses) Motivation. Le problème

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Acronymes et abréviations. Acronymes / Abbréviations. Signification

BASE DE DONNÉES XML NATIVE

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Open Source Job Scheduler

Module http MMS AllMySMS.com Manuel d intégration

OCL - Object Constraint Language

Introduction à MATLAB R

PHP 5. La base de données MySql. A. Belaïd 1

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

Guide d'installation rapide TFM-560X YO.13

Créer une base de données vidéo sans programmation (avec Drupal)

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

Le prototype de la fonction main()

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Stockage du fichier dans une table mysql:

PIVOT. Pivot/Querier Documentation technique XML/XSD/XSLT

Introduction aux concepts d ez Publish

Instructions Mozilla Thunderbird Page 1

Résoudre les problèmes PHP, les meilleures (et les pires) techniques

Chapitre 2. Classes et objets

Gestion centralisée d un réseau de sites discrets. Nicolas JEAN

Environnements de développement (intégrés)

1 Configuration des Fichiers Hosts, Hostname, Resolv.conf

3615 SELFIE. HOW-TO / GUIDE D'UTILISATION

et Active Directory Ajout, modification et suppression de comptes, extraction d adresses pour les listes de diffusion

Faculté Polytechnique de Mons. Le processus d Extraction, Transformation et Load (ETL) dans des entrepôts de données XML

Transcription:

ZEND Studio 1. Installation Progression de l'installation

2. Prise en main L'interface Cration d'un projet Le document PHP

Excution Compltion Une aide est disponible lors de la saisie de code utile pour pour la syntaxe et la dcouverte de l'api.

Dbogueur ZEND Studio 3. Installation

Progression de l'installation 1. Prise en main

L'interface Cration d'un projet Le document PHP

Excution Compltion Une aide est disponible lors de la saisie de code utile pour pour la syntaxe et la dcouverte de l'api.

Dbogueur Script PHP Organisation d'un script Intgration HTML Les pages de codes PHP sont compltement intgres aux pages HTML. Le code du PHP est introduit par la syntaxe suivante: Blocks de code PHP

<?php...?> Standard <?...?> Version lgre <%... %> Syntaxe proche de ASP <SCRIPT LANGUAGE="PHP"> Au moyen du tag SCRIPT Modles Forme simple <html> <head> <title>premiere page PHP</title> </head> <body> Texte HTML <?php echo "Code du PHP";?> </body> </html> <?php echo("envoyer ce texte au client");?><br> <? echo ("Envoyer ce texte au client ");?><br> <?="Envoyer ce texte au client "?><br> <? $variable="toto"; echo ($variable);?> Forme alterne HTML/PHP <?php $expression=false; if ($expression)?> <strong>ecrire en gras : TRUE</strong> <?php else?> <strong>ecrire en gras : FALSE</strong> <?php?> Excutions En ligne de commande Il est possible de lancer l'interprteur PHP la faon d'un PERL ou d'un SHELL. Mais la plupart du temps PHP est un module intgr APACHE. Les options php -h

Usage: php [options] [-f] <file> [--] [args...] php [options] -r <code> [--] [args...] php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...] php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...] php [options] -- [args...] php [options] -a -a Run interactively -c <path> <file> Look for php.ini file in this directory -n No php.ini file will be used -d foo[=bar] Define INI entry foo with value 'bar' -e Generate extended information for debugger/profiler -f <file> Parse and execute <file>. -h This help -i PHP information -l Syntax check only (lint) -m Show compiled in modules -r <code> Run PHP <code> without using script tags <?..?> -B <begin_code> Run PHP <begin_code> before processing input lines -R <code> Run PHP <code> for every input line -F <file> Parse and execute <file> for every input line -E <end_code> Run PHP <end_code> after processing all input lines -H Hide any passed arguments from external tools. -s Display colour syntax highlighted source. -v Version number -w Display source with stripped comments and whitespace. -z <file> Load Zend extension <file>. args... --rf <name> --rc <name> --re <name> Arguments passed to script. Use -- args when first argument starts with - or script is read from stdin Show information about function <name>. Show information about class <name>. Show information about extension <name>. Version php -v PHP 5.2.1 (cli) (built: Feb 7 2007 23:11:26) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies Syntaxe uniquement <?php for ($i=0; $i<10; $i++) print "Je compte ". $i. "\n";?>

Liste des modules intgrs l'interprteur php -m [PHP Modules] bcmath calendar com_dotnet ctype date dom filter ftp hash iconv json libxml mbstring mysql mysqli odbc pcre PDO pdo_sqlite Reflection session SimpleXML SPL SQLite standard tokenizer wddx xml xmlreader xmlwriter zlib [Zend Modules] php -q exo1.php Je compte 0<br> Je compte 1<br> Je compte 2<br> Je compte 3<br> Je compte 4<br> Je compte 5<br> Je compte 6<br> Je compte 7<br> Je compte 8<br>

Je compte 9<br> php -l exo1.php No syntax errors detected in exo1.php Via client Internet On peut solliciter l'interprteur PHP via un browser : URL = http:://serveur/chemin/script.php?arg1=val1&arg2=val2 Arguments Les arguments peuvent tre transmis : En ligne de commande Mthode GET/POST Gestion des URLs Encodage Description base64_decode Dcoder la donne avec MIME base64 base64_encode Coder la donne avec MIME base64 get_meta_tags Extraire les tags Meta depuis un fichier vers un tableau parse_url Analyse le contenu d'une URL rawurldecode Dcode une chane URL rawurlencode Code une chane URL RFC 1738 urldecode Dcode une chane URL urlencode Code une chane URL array parse_url ( string url) host port user pass path query - after the question mark? fragment - after the hashmark # $ php -r 'print_r( parse_url("http://username:password@hostname/path?arg=value#anchor"));' Array ( [scheme] => http [host] => hostname [user] => username [pass] => password [path] => /path [qfuery] => arg=value [fragment] => anchor ) $ php -r 'print_r( parse_url("http://invalid_host..name/"));' Array ( [scheme] => http

) [host] => invalid_host..name [path] => / array pathinfo ( string path) <?php $path_parts = pathinfo("/www/htdocs/index.html"); echo "dirname = ". $path_parts["dirname"]. "\n"; echo "basename = ". $path_parts["basename"]. "\n";; echo "extension = ". $path_parts["extension"]. "\n";?> Affichage de l'explorateur : php exo.php dirname = /www/htdocs basename = index.html extension = html string urldecode ( string str) Dcode n'importe quel codage bas %## dans une string. La chane dcode est retourne. <?php $a = explode('&',$_server['query_string']); $i = 0; while ($i < count($a)) $b = split('=', $a[$i]); echo 'texte ', htmlspecialchars(urldecode($b[0])), ' est ', htmlspecialchars(urldecode($b[1])), "<br />\n"; $i++;?> http://localhost/keyos-editionv4/exo.php?a=aa&b=bb texte a est aa texte b est bb string htmlspecialchars ( string string [, int quote_style [, string charset]]) Conversion '&' (ampersand) '"' double quote) ''' (single quote) '<' (less than) '>' (greater than) '&' '"' when ENT_NOQUOTES is not set. '&#039;' only when ENT_QUOTES is set. '<' '>' <?php $new = htmlspecialchars("<a href='test'>test</a>", ENT_QUOTES); echo $new;

?> Affichage de l'explorateur http://localhost/exercices/exo <a href='test'>test</a> ( Chane convertie en <a href=&#039;test&#039;>test</a>) string htmlentities ( string string [, int quote_style [, string charset]]) Nom de constante ENT_COMPAT ENT_QUOTES ENT_NOQUOTES Description Convertit un " mais pas '. Convertit un " et un '. Ne convertit pas " ni '. <?php $str = "Une 'quote' est <b>bold</b>"; echo htmlentities($str). "\n"; echo htmlentities($str, ENT_QUOTES). "\n";?> Sortie Une 'quote' est <b>bold</b> Une &#039;quote&#039; est <b>bold</b> Programmation Oriente objet Encapsulation Donnes et mthodes membres class Personne public $nom="vide"; public $prenom="vide"; public $age=1; public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age ; Exemple <html> <body> <h1>une classe avec des donnes membres et mthodes membres</h1> <?php class Personne public $nom="vide"; public $prenom="vide";

; public $age=1; public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age?> <html> $p1 = new Personne (); echo "<p>". $p1->nom. "<p>"; echo "<p>". $p1->prenom. "<p>"; echo "<p>". $p1->age. "<p>"; echo "<p>". $p1->affichertout (). "<p>"; Comment PHP voir une instance? object(personne)#1 (3) ["nom"]=> NULL ["prenom"]=> NULL ["age"]=> NULL Rfrences L'appartenance des donnes et des fonctions membres l'objet se fait par la rfrence nommes $this. $this n'est utilis que dans le code de la classe. Protection public, protected, private Il est possible de protger les membres d'une classe au moyen des attributs : public : accessible tout le monde protected : accessible par hritage private : accessible uniquement pour les membres de la classe Si le membre $ affichertout() tait priv, il y aurait erreur <?php class Personne public $nom; public $prenom; public $age; private function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age ;

$p1 = new Personne (); // provoque l'erreur?> echo "<p>". $p1->affichertout (). "<p>"; Sortie Fatal error: Call to private method Personne::afficherTout() from context '' in D:\wamp\www\formation_ricoh\exo6.php on line 31 Constructeur et destructeur class Personne public function construct () public function destruct () <html> <body> <h1>une classe avec constructeur et destructeur</h1> <?php ; class Personne public $nom; public $prenom; public $age; public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age public function construct () echo "Le contructeur"; $this->nom="vide"; $this->prenom="vide"; $this->age=0; public function destruct () echo "Le destructeur"; $this->nom="vide"; $this->prenom="vide";

$this->age=0; $p1 = new Personne (); echo "<p>". $p1->affichertout (). "<p>";?> <html> Setter et getter class Personne public $nom=""; public $prenom=""; public $age=0; public function getnom () return $this->nom; public function setnom ($nom ) $this->nom= $nom; public function getprenom () return $this->prenom; public function setprenom ($prenom ) $this->prenom= $prenom; public function getage () return $this->age; <html> <body> <h1>getter / Setter</h1> <?php class Personne public $nom=""; public $prenom=""; public $age=0; public function getnom () return $this->nom; public function setnom ($nom ) $this->nom= $nom; public function getprenom () return $this->prenom; public function setprenom ($prenom ) $this->prenom= $prenom; public function getage () return $this->age; public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age ; $p1 = new Personne ();

$p1->setnom ("Nouveau nom"); $p1->setprenom ("Nouveau prenom"); echo "<p>". $p1->affichertout (). "<p>";?> <html> Fonction liste d'arguments variable func_num_args() : nombre d'arguments func_get_arg(index) : les arguments un un <?php?> function f() print "Nb arg = ". func_num_args(). "\n"; for ($i=0; $i<func_num_args(); $i++) print func_get_arg($i). "\n"; print "-----------\n"; f(1,2,3); print "-----------\n"; f(1,2,3,4,5); Sortie ----------- Nb arg = 3 1 2 3 ----------- Nb arg = 5 1 2 3 4 5 Paramtres par dfaut class Personne public $nom=""; public $prenom=""; public $age=0; public function settout ($nom="vide", $prenom="vide", $age=0) $this->nom = $nom; $this->prenom = $prenom; $this->age = $age;

public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age ; <html> <body> <h1>surcharge</h1> <?php ; class Personne public $nom=""; public $prenom=""; public $age=0; public function settout ($nom="vide", $prenom="vide", $age=0) $this->nom = $nom; $this->prenom = $prenom; $this->age = $age; public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age $p1 = new Personne (); $p1->settout ("Nouveau nom", "Nouveau prenom", 10); echo "<p>". $p1->affichertout (). "<p>"; $p1->settout (); echo "<p>". $p1->affichertout (). "<p>";?> <html> Surcharge La surcharge se fait en travaillant sur la liste des arguments public function settout () $num_args=func_num_args(); switch ($num_args) case 3 :

$this->nom = func_get_arg(0); $this->prenom = func_get_arg(0); $this->age = func_get_arg(0); break; case 0 : $this->nom = "vide"; $this->prenom = "vide"; $this->age = 0; break; <html> <body> <h1>surcharge</h1> <?php ; class Personne public $nom=""; public $prenom=""; public $age=0; public function settout () $num_args=func_num_args(); switch ($num_args) case 3 : $this->nom = func_get_arg(0); $this->prenom = func_get_arg(1); $this->age = func_get_arg(2); break; case 0 : $this->nom = "vide"; $this->prenom = "vide"; $this->age = 0; break; public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age $p1 = new Personne ();

$p1->settout ("Nouveau nom", "Nouveau prenom", 10); echo "<p>". $p1->affichertout (). "<p>"; $p1->settout (); echo "<p>". $p1->affichertout (). "<p>";?> <html> Hritage class Salarie extends Personne public $anciennete=0; public function affichertout () return Personne::afficherTout (). " Anciennete = ". $this->anciennete ; <html> <body> <h1>hritage</h1> <?php ; class Personne public $nom="vide"; public $prenom="vide"; public $age=1; public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age class Salarie extends Personne $p1 = new Salarie (); echo "<p>". $p1->affichertout (). "<p>";?>

<html> Redfinition La classe drive reprend une fonction de classe de base. <html> <body> <h1>hritage</h1> <?php class Personne public $nom="vide"; public $prenom="vide"; public $age=1; public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age ; class Salarie extends Personne public $anciennete=0; public function affichertout () return Personne::afficherTout (). " Anciennete = ". $this->anciennete ; $p1 = new Salarie (); echo "<p>". $p1->affichertout (). "<p>";?> <html> Interface interface IAfficher public function affichertout (); <html> <body> <h1>interface </h1> <?php

interface IAfficher public function affichertout (); ; class Personne implements IAfficher public $nom="vide"; public $prenom="vide"; public $age=1; public function affichertout () return "Nom = ". $this->nom. " Prenom = ". $this->prenom. " Age = ". $this->age $o = new Personne (); IAfficher $i = $o; echo "<p>". $i->affichertout (). "<p>";?> <html> Mots cls METHODE $self = classe courante $this = objet courant Classe parent = get_parent_class($o) Classe de l'objet = get_class($o) Instanceof class_exists() tostring() <html> <body> <h1>oprateurs</h1> <?php class Personne public $nom="vide"; public $prenom="vide"; public $age=1; public function affichertout ()

; return "Nom = ". $this->nom. " Prenom = ". $self->prenom. " Age = ". $this->age $o = new Personne (); echo "<p>classe = ". get_class($o). "<p>"; echo "<p>parent =". get_parent_class($o). "<p>"; $ret = $o instanceof Personne; echo "<p>instance of =". (string) $ret. "<p>"; echo "<p>exist =". class_exists("personne"). "<p>";?> <html> Eval Permet d'valuer dynamiquement un texte par l'interprteur. Une variable <?php eval ("\$a=10;"); print $a;?> Sortie 10 Une fonction <?php eval ("function f() return 10;"); print f();?> Sortie 10 Build-ins CLASS METHOD FILE LINE construct, destruct, call, get, set, isset, unset, sleep, wakeup, tostring, set_state, clone and autoload are magical in PHP classes. You Introduction XML & XSLT 1. XML Modle de donnes Ascii Il est possible de stocker des donnes au format texte ascii avec une structure propritaire. Mais cela

prsente quelques inconvnients: Structure non documente Difficult dfinir un vocabulaire et une grammaire Obligation de dfinir des moyens de gestion XML A la manire dun fichier ascii, le format XML est bas sur des tags applicatifs issus dun vocabulaire et dune grammaire tablis dans un modle de dfinition appel DTD. reconnaissance en tant que standard par la W3C et OMG dploiement doutils (parsers, traduction vers RDB) Gestion aise par la programmation grce aux interfaces. XML est une considr comme l'ascii du WEB mais contrairement la description des donnes ascii, il prsente les avantages suivants : bas sur des tags donc pas de problme de sparateurs les tags constituent un vocabulaire de domaine tablit dans un fichier joint appel DTD contenu du document XML valid par sa DTD lors du parsing Les tags sont imbriqus et constituent une description objet du document Disponibilit de parser pour diffrents langages par le biais d'interfaces. Structure dun document Prologue <?xml version="1.0"?> <?xml version="1.0"encoding="utf-8" standalone="yes"?> body Structure du document en tant que tags imbriqus enrichis par des attributs. Epilogue Pouvant contenir des section PI et des commentaires <CATALOGUE> <LIVRES> <LIVRE titre="programmation C" auteur="bk" annee="2000"/> <LIVRE titre="programmation JAVA" auteur="fb" annee="2000"/> <LIVRE titre="administration NT2000" auteur="jj" annee="2000"/> <LIVRE titre="programmation PERL" auteur="bk" annee="2000"/> </LIVRES> </CATALOGUE> La DTD Le DTD dfinit le vocabulaire et la smantique des lments utiliss dans un document XML. vocabulaire rgles de grammaire Cest le parser qui exploite de DTD pour valider le contenu du document. Mot cl ELEMENT Signification Dclaration dun lment

ATTLIST ENTITY NOTATION Les lments <! Element Nom catgorie> La catgorie peut tre EMPTY ELEMENT MIXED ANY #REQUIRED #IMPLIED #FIXED Valeurs par dfaut Dclaration des attributs Dclaration dun contenu rutilisable Dclaration dun contenu externe pour viter de le voir interprter Ni texte ni lment enfant Contient un lment enfant mais pas de texte Combinaison de ELEMENT, de #PCDATA, de texte ou contenu. Contenu libre mais conforme XML ( viter) Apparition dans toutes les instances de llment Apparition optionnelle Lattribut doit toujours avoir les valeurs par dfaut. Si la valeur nest pas prsente alors valeur par dfaut prise. <!ELEMENT CATALOGUE (LIVRES) #REQUIRED> <!ELEMENT LIVRES (LIVRE MAGASINE) #REQUIRED> Analyseur syntaxique XML (Parser) Modle SAX Le document XML est valid par la DTD laquelle il est associ. Mais un document XML nest pas forcment associ un DTD, on dit quil nest pas valid. Le document XML est analys par un programme pour organiser en mmoire son hirarchie le rendant ainsi accessible la programmation. Le parser SAX intervient dans le code de l'application sous forme d'vnements (fonction php). Fichier traiter <?xml version= "1.0" encoding= "UTF-8" standalone= "yes"?> <CATALOGUE> <LIVRES> <LIVRE titre= " Programmation C" auteur= " BK" annee= " 2000"/> <LIVRE titre= " Programmation JAVA" auteur= " FB" annee= " 2000"/> <LIVRE titre= " Administration NT2000" auteur= " JJ" annee= " 2000">AAAAA</LIVRE> <LIVRE titre= " Programmation PERL" auteur= " BK" annee= " 2000"/> </LIVRES> </CATALOGUE> Programme PHP <? // Prparation des vnements SAX function startelement ($parser, $name, $attr)

printf ("Dbut de tag : Nom = %s Attribs = %s<br>", $name, implode ($attr)); function endelement ($parser, $name) printf ("Fin de tag : Nom = %s <br>", $name); function characterdata ($parser, $data) $info = strlen (trim($data))? $data : "rien"; printf ("Entre le tag, je trouve %s<br>", $info); // Instancier un parser SAX $parser = xml_parser_create (); // Mettre en place les vnments xml_set_element_handler ($parser, "startelement", "endelement"); xml_set_character_data_handler ($parser, "characterdata"); // Ouvrir et traiter un fichier if (!($fp = fopen ("livres.xml", "r"))) die ("Impossible de trouver le fichier livres.xml"); while (($data = fread ($fp, 4096))) if (!xml_parse ($parser, $data, feof ($fp))) die (sprintf ("XML erreur ligne = %d colonne = %d", xml_get_current_line_number($parser), xml_get_current_column_number($parser)));?> Sortie Dbut de tag : Nom = CATALOGUE Attribs = Entre le tag, je trouve rien Dbut de tag : Nom = LIVRES Attribs = Entre le tag, je trouve rien Entre le tag, je trouve rien Dbut de tag : Nom = LIVRE Attribs = Programmation C BK 2000 Fin de tag : Nom = LIVRE Entre le tag, je trouve rien Entre le tag, je trouve rien Dbut de tag : Nom = LIVRE Attribs = Programmation JAVA FB 2000 Fin de tag : Nom = LIVRE Entre le tag, je trouve rien

Entre le tag, je trouve rien Dbut de tag : Nom = LIVRE Attribs = Administration NT2000 JJ 2000 Entre le tag, je trouve AAAAA Fin de tag : Nom = LIVRE Entre le tag, je trouve rien Entre le tag, je trouve rien Dbut de tag : Nom = LIVRE Attribs = Programmation PERL BK 2000 Fin de tag : Nom = LIVRE Entre le tag, je trouve rien Fin de tag : Nom = LIVRES Entre le tag, je trouve rien Fin de tag : Nom = CATALOGUE Modle DOM 2. SCHEMA Introduction Le schema est un langage description de types de donnes. Il est crit en XML est valid et son vocabulaire est donn par http://www.w3.org/2001/xmlschema. site : http://www.w3.org/tr/2004/per-xmlschema-1-20040318/ Le schma est un document quivalent celui de la DTD. On y dcrit des types de donnes avec leurs rgles et contraintes. Il reprsente une amlioration par rapport la DTD car il est volutif. On peut crire son propre schma pour tous les lments que l'on trouve dans son document. Mais si on utilise un vocabulaire dj existant alors autant utiliser les schma disponibles : biologie, mathmatique, lectronique Notre schma doit son tour respecter le vocabulaire de base renferm dans http://www.w3.org/2001/xmlschema Structure d'un document schema <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema">.../... </xs:schema> Les types de donnes peuvent tre simples (scalaires) ou complexes (agrgs). type simple : string <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> type complexe : sequence <xs:element name="book"> <xs:complextype> <xs:sequence>.../...

</xs:sequence>.../... </xs:complextype> </xs:element> Ceci est une cration d'un type de donnes "character" <xs:element name="character" minoccurs="0" maxoccurs="unbounded"> <xs:complextype> <xs:sequence>.../... </xs:sequence> </xs:complextype> </xs:element> Ceci est une cration d'un type de donnes "lment" bas string <xs:element name="name" type="xs:string"/> <xs:element name="friend-of" type="xs:string" minoccurs="0" maxoccurs="unbounded"/> <xs:element name="since" type="xs:date"/> <xs:element name="qualification" type="xs:string"/> Exemple complet <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="book"> <xs:complextype> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> <xs:element name="character" minoccurs="0" maxoccurs="unbounded"> <xs:complextype> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="friend-of" type="xs:string" minoccurs="0" maxoccurs="unbounded"/> <xs:element name="since" type="xs:date"/> <xs:element name="qualification" type="xs:string"/> </xs:sequence> </xs:complextype> </xs:element> </xs:sequence> <xs:attribute name="isbn" type="xs:string"/> </xs:complextype> </xs:element> </xs:schema> Autre exemple <?xml version="1.0" encoding="utf-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> <!-- definition of simple type elements --> <xs:element name="title" type="xs:string"/> <xs:element name="author" type="xs:string"/> <xs:element name="name" type="xs:string"/> <xs:element name="friend-of" type="xs:string"/> <xs:element name="since" type="xs:date"/> <xs:element name="qualification" type="xs:string"/> <!-- definition of attributes --> <xs:attribute name="isbn" type="xs:string"/> <!-- definition of complex type elements --> <xs:element name="character"> <xs:complextype> <xs:sequence> <xs:element ref="name"/> <xs:element ref="friend-of" minoccurs="0" maxoccurs="unbounded"/> <xs:element ref="since"/> <xs:element ref="qualification"/> <!-- the simple type elements are referenced using the "ref" attribute --> <!-- the definition of the cardinality is done when the elements are referenced --> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="book"> <xs:complextype> <xs:sequence> <xs:element ref="title"/> <xs:element ref="author"/> <xs:element ref="character" minoccurs="0" maxoccurs="unbounded"/> </xs:sequence> <xs:attribute ref="isbn"/> </xs:complextype> </xs:element> </xs:schema> Types nomms <xs:simpletype name="nametype"> <xs:restriction base="xs:string"> <xs:maxlength value="32"/> </xs:restriction> </xs:simpletype> <xs:simpletype name="isbntype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]10"/> </xs:restriction> </xs:simpletype>

Exemple complet <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> <!-- definition of simple types --> <xs:simpletype name="nametype"> <xs:restriction base="xs:string"> <xs:maxlength value="32"/> </xs:restriction> </xs:simpletype> <xs:simpletype name="sincetype"> <xs:restriction base="xs:date"/> </xs:simpletype> <xs:simpletype name="desctype"> <xs:restriction base="xs:string"/> </xs:simpletype> <xs:simpletype name="isbntype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]10"/> </xs:restriction> </xs:simpletype> <!-- definition of complex types --> <xs:complextype name="charactertype"> <xs:sequence> <xs:element name="name" type="nametype"/> <xs:element name="friend-of" type="nametype" minoccurs="0" maxoccurs="unbounded"/> <xs:element name="since" type="sincetype"/> <xs:element name="qualification" type="desctype"/> </xs:sequence> </xs:complextype> <xs:complextype name="booktype"> <xs:sequence> <xs:element name="title" type="nametype"/> <xs:element name="author" type="nametype"/> <xs:element name="character" type="charactertype" minoccurs="0"/> <!-- the definition of the "character" element is using the "charactertype" complex type --> </xs:sequence> <xs:attribute name="isbn" type="isbntype" use="required"/> </xs:complextype> <!-- Reference to "booktype" to define the "book" element --> <xs:element name="book" type="booktype"/> </xs:schema> 3. XPath Introduction XPath est un langage permettant de reprer des nuds (lments) dans un document hirarchique XML.

C'est lui qui est utilis par XSLT pour localiser des parties de documents contenant des lments et leurs attributs. XPath est un standard du W3C : http://www.w3.org/tr/xpath Un emplacement XPath est form de trois parties : Un axe : qui spcifie la relation hirarchique entre le contexte et les noeuds slectionns Le test du noeud : spcifiant le type de noeud recherch Le prdicat : expression boolenne devant tre satisfaite par le noeud pour faire partie de la slection. Contexte Lorsqu'on travaille avec XSLT le contexte est le noeud dans le document XML en cours de traitement. Le contexte consiste en : Un noeud (the context node) Une paire d'entiers poisitifs (context position + context size) Un ensembre de variables bindings Des espace de noms Le contexte "racine ou /" veut dire tout le document. <xsl:template match="/"> Le contexte de la boucle for est chaque lment sur le quel on se positionne avec for. <xsl:for-each loop> Il faut toujours se poser la question sur le contexte en cours de traitement. Chemin Le chemin XPath est une expression du langage XPath initialise pour trouver le contexte. Le chemin reconnat les nuds suivants root = racine du document XML element = un lment du document XML text = Texte d'un lment XML attribute = Attribut d'un lements XML namespace = espace de nom associ un lment XML (attribut commenant par xmlns) processing = PI comment Afin de simplifier les expressions les parsers XPath supportent des abrviations telles que. = nud courant.. = noeud parent chapitre//sparagraphe = child::chapitre//sparagraphe::sparagraphe [@type="warning"] = child::para[attribute::type="warning"] //para = /descendant-or-self::node()/child::para para[3] = para[position()=3]

para the para element children of the context node * all element children of the context node text() all text node children of the context node @name the name attribute of the context node @* all the attributes of the context node para[1] the first para child of the context node para[last()] the last para child of the context node */para all para grandchildren of the context node /doc/chapter[5]/section[2] the second section of the fifth chapter of the doc chapter//para the para element descendants of the chapter element children of the context node //para all the para descendants of the document root and thus = all para elements in the same document as the context node //olist/item all the item elements in the same document as the context node that have an olist parent. the context node.//para the para element descendants of the context node.. the parent of the context node../@lang the lang attribute of the parent of the context node para[@type="warning"] all para children of the context node that have a type attribute with value warning para[@type="warning"][5] the fifth para child of the context node that has a type attribute with value warning para[5][@type="warning"] the fifth para child of the context node if that child has a type attribute with value warning "Introduction"] the chapter children of the context node that have one or more title children with string-value equal to Introduction chapter[title] the chapter children of the context node that have one or more title children employee[@secretary and @assistant] all the employee children of the context node that have both a secretary attribute and an assistant attribute Predicate Un prdicat est un filtre qui permet d'isoler un ensemble de nuds partir d'un axe donn. Il s'agit d'une expression qui est value vraie pour le nud considr. [expression] paragraphe[titre='compte utilisateur'] paragraphe[position() = 1] paragraphe[starts-with(titre, "Gestion")] XPath: Expressions Les filtres de nuds sont forms d'expressions logiques

and, or logical and, or = equal to!= not equal to >, >= greater than, greater than or equal to <, <= less than, less than or equal to Remember to code the < character as the XML entity < in the XSL file. +, -, *, div addition, subtraction, multiply, divide mod modular, returns the integer remainder of a division Computes (unions) two node sets Filtre sur les positions paragraphe[position() >=2 and position() <=4] L'un ou l'autre des noeuds. paragraphe sparagraphe XPath: Functions XSLT dispose d'une grande liste de fonctions pouvant tre utilises dans les expressions Xpath. count Permet de compter le nombre de noeuds dans une liste de noeuds retourne par une expression Xpath. count(nodes) <xsl:value-of select="count(chapitre/paragraphe[id=1])"/> number Permet de convertir une valeur en un numrique. Si la conversion choue alors le rsultat est "NaN" (Not a Numbre) <xsl:value-of select="number(books/book/price)"/></p> position Retourne la position d'un lment dans son contexte. <xsl:number substring Retourne une partie d'une chane de caractres avec un index bas 1. substring(value, start) substring(value, start, length) <xsl:value-of select="substring(name, 1, 3)"/> sum Permet d'effectuer la somme des valeurs de nuds <xsl:value-of select="sum(//price)"/> Gestion de string string string(object?) = convertit des donnes en chane de caractres.

Donne Chane zero 0 +infini Infinity -infini -Infinity entier dcimal Boolen True / false string concat(string, string, string*) = Concatnation des chanes passes en argument. boolean starts-with(string, string) = Vrifie qu'une chane commence bien par une occurrence. Le rsultat est boolen. string substring-before(string, string) = retourne la chane aprs l'occurrence string substring-after(string, string) = retourne la chane avant l'occurrence boolean contains(string, string) = rechecher d'occurrence string substring(string, number, number?) = extrait de chane number string-length(string?) = retourne le nombre de caractres string normalize-space(string?) = enlve les espaces en dbut et en fin. Gestion de boolen boolean boolean(object) = permet la conversion d'objets en boolen un nombre est vrai un node-set est vrai une chane est vraie s'il n'est pas positif ni NaN s'il est non vide si la longueur est non nulle boolean not(boolean) = ngation de la proposition logique boolean true() = retourne vrai toujours boolean false() = retourne faux toujours Gestion de nombre number number(object?) une string contenant un numrique est convertie en numrique boolen true est converti en 1 boolen false est converti en 0 un node-set est converti d'abord en chane number sum(node-set) = la valeur de chaque noeud est convertie en un numrique et le cumule est effectu number floor(number) = convertir le nombre en un entier suprieur immdiat number ceiling(number) = convertir le nombre en un entier infrieur immdiat number round(number) = donne un arrondi du nombre. Gestion des Node-set

number last() =retourne un nombre gal au context size evaluation context. number position() = retourne un nombre gal au contexte position number count(node-set) = retourne le nombre de noeud dans le node-set node-set id(object) = slectionne un objet par son ID. id("foo") id("foo")/child::para[position()=5] string local-name(node-set?) string namespace-uri(node-set?) string name(node-set?) 4. XSL Modle de donnes Le modle de donnes est similaire celui de Xpath. Le traitement XSLT se fait conjointement sur les trois documents suivants: source XML rsultat XML document XSL Le rootnode peut contenir n'importe quelle squence d'lments. Chaque nud est repr par son URI qui peut tre relative ou absolue. para any para element * any element chapter appendix any chapter element and any appendix element olist/item any item element with an olist parent appendix//para any para element with an appendix ancestor element / the root node text() any text node processing-instruction() any processing instruction node() any node other than an attribute node and the root node id("w11") the element with unique ID W11 para[1] any para element that is the first para child element of its parent *[position()=1 and self::para] any para element that is the first child element of its parent para[last()=1] any para element that is the only para child element of its parent items/item[position()>1] any item element that has a items parent and that is not the first item child of its parent div[@class="appendix"]//p any p element with a div ancestor element that has a class attribute with value appendix @class any class attribute (not any element that has a

@* Application des templates <!-- Category: instruction --> <xsl:apply-templates select = node-set-expression mode = qname> <!-- Content: (xsl:sort xsl:with-param)* --> </xsl:apply-templates> Rgles prdfinies Pour les root nodes et les lments node. <xsl:template match="* /"> <xsl:apply-templates/> </xsl:template> class attribute) any attribute Pour les root nodes et les lments node. On poursuit dans le mme mode <xsl:template match="* /" mode="m"> <xsl:apply-templates mode="m"/> </xsl:template> Pour les textes et attributs nodes <xsl:template match="text() @*"> <xsl:value-of select="."/> </xsl:template> Pour une processing instructions et comments <xsl:template match="processing-instruction() comment()"/> Templates nommes Les templates peuvent tre invoques par nom la manire d'une fonction <!-- Category: instruction --> <xsl:call-template name = qname> <!-- Content: xsl:with-param* --> </xsl:call-template> Cration d'lments et attributs Cration d'lment <!-- Category: instruction --> <xsl:element name = qname namespace = uri-reference use-attribute-sets = qnames> <!-- Content: template --> </xsl:element> Cration d'attributs <!-- Category: instruction --> <xsl:attribute name = qname namespace = uri-reference >

<!-- Content: template --> </xsl:attribute> Cration de Texte Une template peut contenir un texte noeud. <!-- Category: instruction --> <xsl:text disable-output-escaping = "yes" "no"> <!-- Content: #PCDATA --> </xsl:text> Cration d'une Processing Instructions <!-- Category: instruction --> <xsl:processing-instruction name = ncname > <!-- Content: template --> </xsl:processing-instruction> <xsl:processing-instruction name="xml-stylesheet">href="book.css" type="text/css"</xsl:processing-instruction> produira <?xml-stylesheet href="book.css" type="text/css"?> Cration d'un Commentaire <!-- Category: instruction --> <xsl:comment> <!-- Content: template --> </xsl:comment> <xsl:comment>this file is automatically generated. Do not edit!</xsl:comment> Produira <!--This file is automatically generated. Do not edit!--> Copier un noeud <!-- Category: instruction --> <xsl:copy use-attribute-sets = qnames> <!-- Content: template --> </xsl:copy> xsl:copy permet de copier le noeud courant. Mais les attributs et les noeuds enfant ne sont pas copis automatiquement. Seuls les noeuds pouvant possder des attributs et de noeuds enfants sont copis. Le noeud racine est trait spcialement car il est cr de manire implicite par xslt. <xsl:template match="@* node()">

<xsl:copy> <xsl:apply-templates select="@* node()"/> </xsl:copy> </xsl:template> Le noeud courant copier peut tre de type attribut <xsl:template name="apply-templates-copy-lang"> <xsl:for-each select="@xml:lang"> <xsl:copy/> </xsl:for-each> <xsl:apply-templates/> </xsl:template> On peut simplement faire <xsl:call-template name="apply-templates-copy-lang"/> au lieu <xsl:apply-templates/> Calcul et gnration de texte Avec xsl:value-of peut extraire du texte depuis la source ou depuis le contenu d'une variable. Les valeurs littrales sont encapsules dans (). Gnration de texte avec xsl:value-of <!-- Category: instruction --> <xsl:value-of select = string-expression disable-output-escaping = "yes" "no" /> xsl:value-of va crer un noeud de type texte dans l'arbre rsultat. L'attribut select est une expression. Cette expression est value et le rsultat est converti en chane de caractres. Le texte gnr est automatiquement fusionn avec les textes adjacents. xsl:copy-of peut utilis pour copier un ensemble de noeuds sur l'arbre sans passer par une conversion texte. <xsl:template match="person"> <p> <xsl:value-of select="@given-name"/> <xsl:text> </xsl:text> <xsl:value-of select="@family-name"/> </p> </xsl:template> <xsl:template match="person"> <p> <xsl:value-of select="given-name"/> <xsl:text> </xsl:text>

<xsl:value-of select="family-name"/> </p> </xsl:template> Attribute Value Templates La valeur d'un attribut peut tre value avant l'affectation. Pour cela on utilise L'exemple suivant cre un lment img depuis un noeud <photograph du source. L'emplacement de l'image est compos du contenu de la variable $image-dir et de la string-value de l'lment enfant <href> <xsl:variable name="image-dir">/images</xsl:variable> <xsl:template match="photograph"> <img src="$image-dir/href" width="size/@width"/> </xsl:template> Le source <photograph> <href>headquarters.jpg</href> <size width="300"/> </photograph> Le rsultat est <img src="/images/headquarters.jpg" width="300"/> On n'aime pas les imbrications de... <a href="#id(@ref)/title"> N'est pas permis, on utilise plutt <a href="#id(@ref)/title"> Les nombres <!-- Category: instruction --> <xsl:number level = "single" "multiple" "any" count = pattern from = pattern value = number-expression format = string lang = nmtoken letter-value = "alphabetic" "traditional" grouping-separator = char grouping-size = number /> xsl:number est utilis pour insrer un nombre format dans l'arbre rsultat. Le nombre est spcifi dans une expression.

La valeur de l'attribut contient l'expression devant tre value. Le nombre est converti en entier naturel puis en chane de caractres. <xsl:template match="items"> <xsl:for-each select="item"> <xsl:sort select="."/> <p> <xsl:number value="position()" format="1. "/> <xsl:value-of select="."/> </p> </xsl:for-each> </xsl:template> Si aucune valeur de l'attribut n'est spcifie alors la valeur de position() du noeud courant est fournie. <xsl:template match="ol/item"> <fo:block> <xsl:number/><xsl:text>. </xsl:text><xsl:apply-templates/> </fo:block> <xsl:template> <xsl:template match="title"> <fo:block> <xsl:number level="multiple" count="chapter section subsection" format="1.1 "/> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="appendix//title" priority="1"> <fo:block> <xsl:number level="multiple" count="appendix section subsection" format="a.1 "/> <xsl:apply-templates/> </fo:block> </xsl:template> L'exemple suivant numrote squentiellement les notes du chapitre. <xsl:template match="note"> <fo:block> <xsl:number level="any" from="chapter" format="(1) "/> <xsl:apply-templates/> </fo:block> </xsl:template> The following example would number H4 elements in HTML with a three-part label: <xsl:template match="h4">

<fo:block> <xsl:number level="any" from="h1" count="h2"/> <xsl:text>.</xsl:text> <xsl:number level="any" from="h2" count="h3"/> <xsl:text>.</xsl:text> <xsl:number level="any" from="h3" count="h4"/> <xsl:text> </xsl:text> <xsl:apply-templates/> </fo:block> </xsl:template> Conversion nombre/chane de caractres Grce l'attribut format, il est possible de convertir une liste de numriques en chane de caractres. La valeur par dfaut est 1. format spare en squence de mots et chaque mot est une valeur maximale de squence alphanumrique : Nd, Nl, No, Lu, Ll, Lt, Lm or Lo. format token squence 1 1 2... 10 11 12... 01 01 02... 09 10 11 12... 99 100 101. A A B C... Z AA AB AC... a a b c... z aa ab ac... i i ii iii iv v vi vii viii ix x... I I II III IV V VI VII VIII IX X... Rptition <!-- Category: instruction --> <xsl:for-each select = node-set-expression> <!-- Content: (xsl:sort*, template) --> </xsl:for-each> xsl:for-each contient une template qui est instancie pour chaque noeud slectionn. L'attribut select est requis et contient l'expression valuer pour retourner un node-set. Les nuds sont traits dans l'ordre du document moins que une spcification de tri ne soit demande. XML <customers> <customer> <name>...</name> <order>...</order> <order>...</order> </customer> <customer> <name>...</name> <order>...</order>

<order>...</order> </customer> </customers> XSL <xsl:template match="/"> <html> <head> <title>customers</title> </head> <body> <table> <tbody> <xsl:for-each select="customers/customer"> <tr> <th> <xsl:apply-templates select="name"/> </th> <xsl:for-each select="order"> <td> <xsl:apply-templates/> </td> </xsl:for-each> </tr> </xsl:for-each> </tbody> </table> </body> </html> </xsl:template> Les conditions XSLT support deux types de conditions : xsl:if = avec un seul if-then xsl:choose = avec plusieurs possibilits xsl:if <!-- Category: instruction --> <xsl:if test = boolean-expression> <!-- Content: template --> </xsl:if> xsl:if possde un attribut test dans lequel une expression boolenne est value. <xsl:template match="namelist/name"> <xsl:apply-templates/> <xsl:if test="not(position()=last())">, </xsl:if> </xsl:template>

<xsl:template match="item"> <tr> <xsl:if test="position() mod 2 = 0"> <xsl:attribute name="bgcolor">yellow</xsl:attribute> </xsl:if> <xsl:apply-templates/> </tr> </xsl:template> xsl:choose <!-- Category: instruction --> <xsl:choose> <!-- Content: (xsl:when+, xsl:otherwise?) --> </xsl:choose> <xsl:when test = boolean-expression> <!-- Content: template --> </xsl:when> <xsl:otherwise> <!-- Content: template --> </xsl:otherwise> xsl:choose slectionne la possibilit pour laquelle le test est valu vrai. <xsl:template match="orderedlist/listitem"> <fo:list-item indent-start='2pi'> <fo:list-item-label> <xsl:variable name="level" select="count(ancestor::orderedlist) mod 3"/> <xsl:choose> <xsl:when test='$level=1'> <xsl:number format="i"/> </xsl:when> <xsl:when test='$level=2'> <xsl:number format="a"/> </xsl:when> <xsl:otherwise> <xsl:number format="1"/> </xsl:otherwise> </xsl:choose> <xsl:text>. </xsl:text> </fo:list-item-label> <fo:list-item-body> <xsl:apply-templates/> </fo:list-item-body> </fo:list-item> </xsl:template> Tri avec sort <xsl:sort

select = string-expression lang = nmtoken data-type = "text" "number" qname-but-not-ncname order = "ascending" "descending" case-order = "upper-first" "lower-first" /> xsl:sort est un lment enfant de xsl:apply-templates ou de xsl:for-each. Lorsqu'il y a plus d'un lment, xsl:sort alors se comportent comme cl premire et cl secondaire. xsl:sort force xsl:apply-templates ou xsl:for-each trier la liste de noeuds avant de les traiter. Les attributs de xsl:sort permettent de contrler le tri. Attributs Valeurs possibles order ascending(defaut) ou descending data-type texte (dfaut), numbre ou QNames case-order upper-first ou lower-first Soit une base de donnes d'employs. <employees> <employee> <name> <given>james</given> <family>clark</family> </name>... </employee> </employees> La liste d'employs est trie par nom: <xsl:template match="employees"> <ul> <xsl:apply-templates select="employee"> <xsl:sort select="name/family"/> <xsl:sort select="name/given"/> </xsl:apply-templates> </ul> </xsl:template> <xsl:template match="employee"> <li> <xsl:value-of select="name/given"/> <xsl:text> </xsl:text> <xsl:value-of select="name/family"/> </li> </xsl:template> Variables et Parameters <!-- Category: top-level-element --> <!-- Category: instruction -->

<xsl:variable name = qname select = expression> <!-- Content: template --> </xsl:variable> <!-- Category: top-level-element --> <xsl:param name = qname select = expression> <!-- Content: template --> </xsl:param> Une variable est un nom associ une valeur. En XSLT il y a deux faons d'associer un nom une valeur : xsl:variable xsl:param Les deux lments ont un attribut "name" qui est un QName. Valeur de Variables et Paramtres Trois manires d'affecter une valeur: Si l'attribut select est prsent alors la valeur est donne par l'expression Si l'attribut select n'est pas prsent alors la template doit donner la valeur aprs valuation Si l'attribut select n'est pas prsent et possde un contenu vide alors la valeur est une chane vide. <xsl:variable name="x"/> est quivalent <xsl:variable name="x" select="''"/> Variables et Parameters avec xsl:copy-of <!-- Category: instruction --> <xsl:copy-of select = expression /> xsl:copy-of peut tre utilis pour insrer un fragment d'arbre rsultat dans l'arbre rsult sans passer par une conversion en chane de caractres. Variables et parameters Top-level xsl:variable et xsl:param sont autoriss au niveau global pour tre vus dans tous les blocs de code. Le paramtre variable para-font-size est dclar en global pour tre utilis par la template <xsl:variable name="para-font-size">12pt</xsl:variable> <xsl:template match="para">

<fo:block font-size="$para-font-size"> <xsl:apply-templates/> </fo:block> </xsl:template> Variables and parameters dans une Template xsl:variable et xsl:param sont autorises dans une template. xsl:variable est possible n'importe o dans la template tandis que xsl:param n'est permis que immdiatement aprs xsl:template. Attention au conflit de noms et la visibilit des entits dclares. Ceci est une erreur <xsl:template name="foo"> <xsl:param name="x" select="1"/> <xsl:variable name="x" select="2"/> </xsl:template> Ceci est correcte <xsl:param name="x" select="1"/> <xsl:template name="foo"> <xsl:variable name="x" select="2"/> </xsl:template> Passer des paramtres aux Templates <xsl:with-param name = qname select = expression> <!-- Content: template --> </xsl:with-param> Les paramtres sont passs aux templates au moyen xsl:with-param. La valeur du nom de param est un Qname. On peut utiliser xsl:with-param aussi bien dans xsl:call-template que dans xsl:applytemplates. <xsl:template name="numbered-block"> <xsl:param name="format">1. </xsl:param> <fo:block> <xsl:number format="$format"/> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="ol//ol/li"> <xsl:call-template name="numbered-block"> <xsl:with-param name="format">a. </xsl:with-param> </xsl:call-template> </xsl:template>

Autres fonctions node-set document(object, node-set?) Permet d'extraire un node-set depuis un document XML extrieur. Le rsultat est fusionn avec le node-set courant. Keys Keys fonctionne avec les documents possdant des rfrences croises explicites : ID, IDREF et IDREFS XSLT supporte cela au travers de XPath avec id() mais il y a certaines limitations. Les attributs ID sont dclars dans la DTD et doivent respecter : L'unicit Un nom valide (pas d'espace) L'lment key possde trois parties : Le noeud possdant la key Le nom du key (QName) La valeur du key Stylesheet dclare implicitement un ID au moyen de xsl:key pour chaque lment rencontr en se basant sur l'unicit du nom ainsi un lment de nom x aura un ID=x <!-- Category: top-level-element --> <xsl:key name = qname match = pattern use = expression /> <xsl:key permet de dclarer les keys. L'expression est value une seule fois pour chaque nud. <xsl:key name="idkey" match="div" use="@id"/> Une expression key("idkey",@ref) retournera le mme rsultat que id(@ref) en supposant la dclaration suivante dans la DTD. <!ATTLIST div id ID #IMPLIED> Supposant l'lment suivant. <prototype name="key" return-type="node-set"> <arg type="string"/> <arg type="object"/> </prototype> et une fonction y faisant rfrence <function>key</function>

Alors le stylesheet gnrera un hyperlien comme cela <xsl:key name="func" match="prototype" use="@name"/> <xsl:template match="function"> <b> <a href="#generate-id(key('func',.))"> <xsl:apply-templates/> </a> </b> </xsl:template> <xsl:template match="prototype"> <p><a name="generate-id()"> <b>function: </b>... </a></p> </xsl:template> Key peut servir extraire une key depuis un autre document Soit un document contenant <bibref>xslt</bibref> Soit un autre document XML bib.xml possdant une entre <entry name="xslt">...</entry> Alors le stylesheet effectuera la transformation comme cela. <xsl:key name="bib" match="entry" use="@name"/> <xsl:template match="bibref"> <xsl:variable name="name" select="."/> <xsl:for-each select="document('bib.xml')"> <xsl:apply-templates select="key('bib',$name)"/> </xsl:for-each> </xsl:template> Formater un nombre string format-number(number, string, string?) On convertit le nombre selon un modle (string) et avec un format dcimal (string). <!-- Category: top-level-element --> <xsl:decimal-format name = qname decimal-separator = char grouping-separator = char infinity = string minus-sign = char

NaN = string percent = char per-mille = char zero-digit = char digit = char pattern-separator = char /> xsl:decimal-format est inspir du modle : classe DecimalFormatSymbols de la JDK 1.1 decimal-separator grouping-separator percent per-mille zero-digit the character used for the decimal sign; the default value is the period character (.) the character used as a grouping (e.g. thousands) separator; the default value is the comma character (,) the character used as a percent sign; the default value is the percent character (%) the character used as a per mille sign; the default value is the Unicode per-mille character (#x2030) the character used as the digit zero; the default value is the digit zero (0) The following attributes control the interpretation of characters in the format pattern: digit the character used for a digit in the format pattern; the default value is the number sign character (#) pattern-separator the character used to separate positive and negative sub patterns in a pattern; the default value is the semi-colon character (;) Les attributs suivant sont utiliss pour le rsultat infinity the string used to represent infinity; the default value is the string Infinity NaN the string used to represent the NaN value; the default value is the string NaN minus-sign the character used as the default minus sign; the default value is the hyphen-minus character (-, #x2d) Fonctions utiles node-set current()=retourne un node-set ne contenant que le noeud courant comme membre. <xsl:value-of select="current()"/> Est quivalent <xsl:value-of select="."/> Le noeud courant est en principe diffrent de celui qui est spcifi entre [] <xsl:apply-templates select="//glossary/item[@name=current()/@ref]"/>