Sie sind auf Seite 1von 13

2/10/2009

Création dynamique
XSLT 2 d’éléments &
attributs

xsl:copy Exemple
<p>Hello, world!</p>
Copie peu profonde <xsl:template match="p">
<xsl:copy use-attribute-sets="P ">
<xsl:copy use-attribute-sets=”qnames”> <xsl:value-of select="."/>
<!-- Content: template --> </xsl:copy>
</xsl:template>
</xsl:copy> <xsl:attribute-set name="P">
<xsl:attribute name="align">left</xsl:attribute>
<xsl:attribute name="style">color:blue</xsl:attribute>
</xsl:attribute-set>

<p align="left" style="color:blue">Hello, world!</p>

1
2/10/2009

Exemple Exemple
Transformation identité
<xsl:stylesheet> <xsl:template match=“node()”>
<xsl:template match=“@*|node()”> …
<xsl:copy> </stylesheet>
<xsl:apply-templates select= =“@*|node()”/>
</xsl:copy>
</xsl:template> Cette pattern ne matche pas les nœuds
</stylesheet> attributs
et les nœuds namespace
Attention aux axes implicites:
child::node() ne selectionne pas les attributs

xsl:element
xsl:copy-of
Copie profonde: insertion d’un fragment dans Cet élément XSL est utilisé pour créer
l’arbre résultat. Copie les attributs, les un élément avec un nom calculé
namespaces et les descendants
<xsl:element name=“name”
namespace=”URI”
<xsl:copy-of select=“expression”> use-attribute-sets=”qnames”>
<!-- Content: template --> <!-- Content: template-->
</xsl:copy> </xsl:element>

2
2/10/2009

xsl:attribute Exemple
<picture>
<xsl:attribute name="source">
Cet élément XSL est utilisé pour créer <xsl:value-of select="images/name" />
un attribut à un élément </xsl:attribute>
</picture>
Nom calculé
<xsl:attribute name=“name“
<xsl:element name = "QQQ" >
<!-- Attribute value: template -->
<xsl:attribute name = "xxx" >111</xsl:attribute>
</xsl:attribute>
<xsl:attribute name = "{name(*[1])}" >
<xsl:value-of select = "//BBB" />
</xsl:attribute>
</xsl:element> Attribut value template

Exemple
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml"/>

<xsl:template match="*">
Eléments acceptables
<xsl:element name="{name(.)}">
<xsl:for-each select="@*">
<xsl:attribute name="{name(.)}">
au niveau global
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Elimination
des namespaces
pi et comments

3
2/10/2009

Eléments globaux
xsl:import
xsl:include
xsl:strip-space
xsl:preserve-space
xsl:output
xsl:key Variables
xsl:decimal-format
xsl:namespace-alias
xsl:attribute-set
xsl:variable
xsl:param
xsl:template

Variables Variables
• Une variable x est déclarée avec:
<xsl:variable name="x" select="p"/>
où p est une expression XPATH. • Il n’est pas possible de changer la
valeur d’une variable (immutable).
• La valeur de x est obtenue avec $x. • Une variable peut contenir une chaîne de
• Portée: Une variable est soit globale, soit caractère ou une structure XML (arbre)
local (à l’intérieur d’un template).
• Contenu: précisé avec l’attribut select ou à
l’intérieur de l’élément.

4
2/10/2009

Exemples Exemples
<xsl:variable name=“site”
select= "http://yoda.inrialpes.fr/tp12.xml"/> • Utilisation des variables
<xsl:for-each select="$features">

<xsl:variable name=“chapter” select="chapter[2]"/> • Récupération du résultat d’une fonction


<xsl:variable name="path">
<xsl:variable name="im" <xsl:call-template name="create_path">
<xsl:with-param name="points" select="point"/>
select="document("file://localhost/im.xml")"/> </xsl:call-template>
</xsl:variable>

Limitations du type ID
• Les attributs ID doivent être déclarés
dans une DTD
Références et clés • L'ID d'un élément ne peut être spécifié
que dans un attribut.
xsl:key • Un élément peut avoir au plus un ID.
• Un élément au plus peut avoir un ID
particulier.

5
2/10/2009

<xsl:key name="preg" match="person" use="@id"/>

Exemple d’utilisation Clé


• Calcul de groupes à partir d’une liste • Une clé est un triplet contenant:
d’élément
• le nom de la clé
• Tables XML en sortie d’une base de • L’ensemble de noeuds qui a la clé
données

<records>
• la valeur de la clé (une chaîne de
caractères)
<contact id="01"> …</contact> Contacts ayant nom
<contact id="02"> …</contact> le même nom
... Application: text  nodeset
</records>
un nœud ne peut appartenir qu’à une seule image

<persons>
<xsl:key name="preg"
<person name="Tarzan"
match="person"
id="050676"/>
use="@id"/><person name="Donald" id="070754"/> <person name="Dolly" id="231256"/> </persons>

xsl:key Fonction key()


<xsl:key name = qname match = pattern
use = expression /> Fonction: node-set key(string, object)

<cds> Soit la déclaration:


<cd name=“Moby" id="043"/> <xsl:key name="idkey" match="div" use="@id"/>
<cd name=“Atos" id="707"/> alors
</cds> key("idkey",@ref) est équivalent à id(@ref)
<xsl:key name=“idkey" match=“cd" use="@id"/>
Utilisation: key("idkey",@ref)

6
2/10/2009

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:key name="preg" match="person" use="@id"/><xsl:template match="/"> <html> <body> <xsl:for-each select="key('preg','050676')"> <p> Id: <xsl:value

<xsl:stylesheet …> Exemple


<xsl:key name=“idkey" match=“cd" use="@id"/>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="key('cd', '743')">
<p> Id: <xsl:value-of select="@id"/><br />
Contexte et Régles
Name: <xsl:value-of select="@name"/>
</p>
</xsl:for-each> Attribut mode
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Modes
Raison d’être :
un même noeud peut être traité plusieurs fois.
Exemple :
• On parcourt tous les chapitres et sections d’un
livre pour produire une table des matières. On
les parcourt à nouveau pour publier le contenu.
• Donc il faut des règles différentes s’appliquant
aux même noeuds : on les distingue par le
mode.

7
2/10/2009

Instruction itérative
<xsl:for-each select=”node-set-expression”>
Instructions XSLT <!-- Content: template -->
</xsl:for-each>
if
<xsl:for-each select="catalog/cd">
for-each <xsl:sort select="artist"/>
<tr>
choose & when <td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>

8
2/10/2009

Instuction conditionnelle Instuction choix


<xsl:if test=”boolean-expression”>
<!-- Content: template --> <xsl:choose>
</xsl:if <!-- Content: xsl:when+, xsl:otherwise? -->
</xsl:choose>
<xsl:if test="price &gt; 10">
<tr> <xsl:when test=”boolean-expression”>
<td><xsl:value-of select="title"/></td> <!-- Content: template -->
<td><xsl:value-of select="artist"/></td> </xsl:when>
</tr>
</xsl:if> <xsl:otherwise>
<!-- Content: template -->
<xsl:if test="following-sibling::*[1]/text() != ' ' "
</xsl:otherwise>
<xsl:value-of-select= ....
</xsl:if>

Exemple
<xsl:choose>
<xsl:when test="$closed = 1">
<path d="{$path} Z"/>
</xsl:when>
<xsl:otherwise>
Modularité
<path d="{$path}" style="fill:none"/>
</xsl:otherwise>
</xsl:choose>

9
2/10/2009

Include & Import


<xsl:include href=”uri”/>
Inclusion structurale,
Sémantique sans changement. Navigateur web
<xsl:import href=”uri”/>
&
Les règles et définitions importés ont une priorite inf.
Cette priorité peut-être forcée par apply-imports à la place
xslt
de apply-templates.

Utilisation
<?xml-stylesheet type=”text/xsl” href=”feuille.xsl”?>
<book>
<title> les misérables </title>
<author> Victor hugo </author>
<price> 12 </price>
Programmation
</book>
Certains navigateurs acceptent d’appliquer la transformation
procédurale
xslt référencée qui génère du html avant de procéder à
l’affichage

Remarque: Cascading Style Sheet (CSS) est


préférable en général.

10
2/10/2009

Règles avec nom


Principes Fonctions
Différente du style push/pull utilisé pour une
• Possibilité de définir des fonctions avec
paramètres
transformation vers html par exemple

Usage de: <xsl:template name="render-feature">


xsl:call-template: appel de la procédure <xsl:param name="features"/>
xsl:with-param: passage des paramétres <xsl:param name="closed"/>
<xsl:param name="colour"/>
xsl:variable: récupération du résultat ...
</xsl:template>

Règles avec nom


Fonctions Exemple
<map>
... Entrée XML Sortie SVG
• Méchanisme d’appel
<land>
<feature name="Granville Island">
<point x="265" y="450"/>
<xsl:call-template name="render-feature"> <point x="275" y="448"/>
<point x="20" y="57"/>
<xsl:with-param name="features" select="/map/land"/> ...
XSLT
<xsl:with-param name="closed" select="1"/> </feature>
From SchemaSoft, Vancouver
<xsl:with-param name="colour">blue</xsl:with-param> <feature name="Downtown Vancouver">
<point x="0" y="0"/>
</xsl:call-template> <point x="0" y="60"/>
...
</feature>
3 manières de passer un paramètre </land>
...
</map>

11
2/10/2009

<!-- render a "feature", a simple polygon that is either open or closed -->
<xsl:template name="render-feature">

Appel d’une règle


<xsl:param name="features"/>
<xsl:param name="closed"/>
Règle render-feature
<xsl:param name="colour"/>

Règle 1 <!-- style of polygons -->


<g style="stroke:{$colour}; fill:{$colour}">
<xsl:template match="/">
<!-- loop through each feature -->
<svg width="100%" height="100%" viewBox="0 0 650 450"> <xsl:for-each select="$features">
<!-- render land -->
<desc><xsl:value-of select="@name"/></desc>
<xsl:call-template name="render-feature"> <!-- draw the path, open or closed -->
<xsl:with-param name="features" select="/map/land/feature"/> <!-- stuff the meat of an svg "path" into a variable --> <xsl:choose>
<xsl:variable name="path"> <xsl:when test="$closed = 1">
<xsl:with-param name="closed" select="1"/> <xsl:call-template name="create_path"> <path d="{$path} Z"/>
<xsl:with-param name="points" select="point"/> </xsl:when>
<xsl:with-param name="colour">yellow</xsl:with-param> <xsl:otherwise>
</xsl:call-template>
</xsl:call-template> </xsl:variable> <path d="{$path}" style="fill:none"/>
</xsl:otherwise>
</svg> </xsl:choose>
</xsl:template> </xsl:for-each>
suite </g>
</xsl:template>

<!-- Create the meat of a path's "d" attribute -->


<xsl:template name="create_path">
<xsl:param name="points"/>
Règle create_path
<!-- extract x and y points into a string -->
<xsl:variable name="pointlist">
<!-- loop through points -->
<xsl:for-each select="$points" xml:space="preserve">
<xsl:value-of select="@x"/>,<xsl:value-of select="@y"/> L
</xsl:for-each>
</xsl:variable>

<!-- normalize spaces in path -->


XSLT & Schémas
<xsl:variable name="pointlist1" select="normalize-space($pointlist)"/>

<!-- remove trailing ' L' (2 chars)-->


<xsl:variable name="pointlist2"
select="substring($pointlist1,1,string-length($pointlist1)-2)"/>

<!-- add first 'M' -->


<xsl:variable name="pointlist3" select="concat('M ',$pointlist2)"/>

<!-- return the value -->


<xsl:value-of select="$pointlist3"/>
</xsl:template>

12
2/10/2009

13

Das könnte Ihnen auch gefallen