XPATH / XSLT

 

Olivier.Corby@sophia.inria.fr

http://www/inria.fr/acacia


 
 

XPath/XSLT    5/3/2004

1/48


 

Plan

 

  1. XPath : XML Path Language

  2. XSLT : Extensible Stylesheet Language Transformation

  3. XQuery

  4. XLink : XML Linking Language

  5. XPointer


 

XPath

 

XML Path Language


 

XPath

 


 

XPath Exemple

 

XPath :

/talk/slide/title   ->   <title>XPath Exemple</title>

Document :

<talk>
	<slide>
		<title>XPath Exemple</title>
		...
	</slide>
</talk>

 

XPath Exemple

 

XPath :

/talk/slide[2]/title   ->   <title>XLink</title>

Document :

<talk>
	<slide>
		<title>XPath Exemple</title>
		...
	</slide>
	<slide>
		<title>XLink</title>
		...
	</slide>
</talk>

 

XPath Exemple

 

XPath :

/talk/slide[@id='xlk']/title -> <title>XLink</title>

Document :

<talk>
	<slide id='xpt'>
		<title>XPath Exemple</title>
		...
	</slide>
	<slide id='xlk'>
		<title>XLink</title>
		...
	</slide>
</talk>

XPath :

/talk/slide[title='XLink']/title -> <title>XLink</title>

 

XPath Exemple

 

Tous les éléments fils :

/talk/*

Tous les attributs :

/talk/@*

Tous les fils de type text :

/talk/text()

Tous les éléments fils et les fils de type text :

/talk/node()

Tous les descendants de type para ou section :

/talk/descendant::*[self::para or self::section]

Tous les descendants de type section, ou de type para qui ne contiennent pas de citation :

/talk/descendant::*[(self::para and not(citation)) or self::section]

 

Axes XPath

 

Axes de parcours de l'arbre XML

self noeud courant
child axe par défaut
descendant
descendant-or-self
parent
ancestor
ancestor-or-self
preceding ancêtres exclus
following descendants exclus
preceding-sibling frêres précédents
following-sibling frêres suivants
attribute
namespace

 

Axes XPath

 

Ces axes forment une partition et contiennent tous les noeud de l'arbre


 

Exemples Axe XPath

 

Le premier transparent d'une partie précédente dont le titre est XML :

preceding::part[title='XML']/slide[1]

La section suivante dont l'attribut id est XSLT :

preceding::section[title='XML']/following::section[@id='XSLT']

 

Fonctions prédéfinies

 

Exemples

/talk/slide[contains(title, 'XSLT')]

/talk/slide[count(*)>5]

 

XPath 2.0

 

Extensions de XPath Pour XQuery


 

Expressions

 

if (Exp) then Exp else Exp

some | every Variable in Exp satisfies Exp  

every $person in //team satisfies $person/@fulltime


 

XSL

 

Extensible Stylesheet Language


 

XSL : Extensible Stylesheet Language

 


 

XSLT : XSL Transformations

 

http://www.w3.org/TR/xslt


 

Transformations XSLT

 


 

Exemple de transformation

 

<chapter>
	<title>XML</title>    -->      <h1>XML</h1>
 
<section>             
	<title>XSLT</title>   -->      <h2>XSLT</h2>

Règles de transformation :

<xsl:template match='chapter'>

	<h1><xsl:value-of select='title'/></h1>

</xsl:template>

<xsl:template match='section'>

	<h2><xsl:value-of select='title'/></h2>

</xsl:template>


 

Engendrer du HTML

 

<xsl:template match='/'>

    <html>
	<head>
		<title><xsl:value-of select='doc/title'/></title>
	</head>
	<body>
		<xsl:apply-templates/>
	</body>
    </html>

</xsl:template>

 

Template

 

xsl:apply-templates appliquer les règles sur les fils
xsl:apply-templates select='EXP' appliquer les règles sur EXP

 

Template

 

Template avec un mode particulier :

<xsl:template match='book' mode='index'>

</xsl:template>

Appel du template avec un mode :

<xsl:apply-templates select='book' mode='index' />

 

Template nommé

 

xsl:call-template name='NAME' appeller le template de nom NAME
xsl:with-param name='NAME' select='VALUE' passer un paramètre
xsl:param name='NAME' déclarer un paramètre

 

Call template

 

<xsl:template name='test'>
   <xsl:param name='p' />
...
   <xsl:value-of select='$p' />

</xsl:template>



<xsl:call-template name='test'>
	<xsl:with-param name='p' select='.' />
</xsl:call-template>


 

Template récursif

 

<xsl:template name='clean'>
<xsl:param name='str' />
<xsl:param name='obj' />

<xsl:choose>

<xsl:when test='contains($str, $obj)'>
    <xsl:call-template name='clean'>

	<xsl:with-param name='str'>
	    <xsl:value-of select='concat(substring-before($str, $obj), 
					 substring-after($str, $obj))'/>
	</xsl:with-param>
	<xsl:with-param name='obj' select='$obj'/>

    </xsl:call-template>
</xsl:when>

<xsl:otherwise>
	<xsl:value-of select='$str'/>
</xsl:otherwise>

</xsl:choose>
</xsl:template>

 

Opérateurs

 

xsl:value-of select='EXP' calculer et insérer la valeur de EXP
xsl:if test='COND' expression conditionnelle
xsl:choose, xsl:when, xsl:otherwise choix multiples
xsl:for-each select='EXP' itérateur sur les éléments de EXP
xsl:text insérer du texte
xsl:copy insérer une copie de l'élément courant

 

Traiter plusieurs documents

 

Une feuille de style peut traiter plusieurs documents à la fois

<xsl:variable name='doc' select='document("profile.xml")'/>

<xsl:value-of select='$doc/book/chapter[title="Guerre et Paix"]' />

<xsl:apply-templates select='.'>
	<xsl:with-param name='profile' select='$doc' />
</xsl:apply-templates>


 

Test

 

L'élément courant est-il le dernier :

<xsl:if test='position() != last()'>
	<br/>
</xsl:if>

Choix multiples

<xsl:choose>
   <xsl:when test='position() = 1'>

   </xsl:when>

   <xsl:otherwise>

   </xsl:otherwise>
</xsl:choose>

 

Exemple XSLT

 

Insérer le titre de tous les slides :

<xsl:for-each select='talk/slide'>

	<xsl:value-of select='title'/><br/>

</xsl:for-each>

Appliquer les règles sur le corps :

<xsl:apply-templates select='body'/>

 

Exemple XSLT

 

Insérer le titre de la partie courante :

<xsl:value-of select='ancestor::part/title'/>

Compter le nombre de sections du chapitre :

<xsl:template match='chapter'>

	<xsl:value-of select='count(section)'/>

</xsl:template>

 

Copier un document

 

<xsl:template match='@* | node()'>

    <xsl:copy>
	<xsl:apply-templates select='@* | node()' />
    </xsl:copy>

</xsl:template>

 

Créer un lien hypertexte

 

<xsl:template match='lien'>

   <a href='{@id}'> <xsl:value-of select='.' /> </a>

</xsl:template>

 

Créer un élément

 

<xsl:element name='pref:{local-name()}'>

	<xsl:value-of select='content' />

</xsl:element>

 

Créer un attribut

 

<xsl:attribute name='pref:{local-name()}'>

	<xsl:value-of select='content' />

</xsl:attribute>

 

Engendrer un tableau trié

 

Classer les personnes par ville, le tout trié par ordre alphabétique

<xsl:template match="sort">
<table>
<xsl:for-each select='person/city[not(preceding::person/city=.)]'>
	<xsl:sort/>
	<tr>
		<td><xsl:value-of select='.'/></td>

		<xsl:for-each select='ancestor::sort/person[city=current()]'>
			<xsl:sort/>
			<td><xsl:value-of select='name'/></td>
		</xsl:for-each>
	</tr>
</xsl:for-each>
</table>
</xsl:template>
<sort>
	<person><name>Fabien</name>	<city>Antibes</city></person>
	<person><name>Patrick</name>	<city>Nice</city></person>
	<person><name>Olivier</name>	<city>Auribeau</city></person>
	<person><name>Alain</name>	<city>Antibes</city></person>
</sort>	

Résultat :

Antibes Alain Fabien
Auribeau Olivier
Nice Patrick

 

Traitement de XSLT

 

Mozilla et explorer possèdent un moteur de feuilles de styles XSLT

Intégrer l'instruction suivante dans le document XML

<?xml-stylesheet href="talk.xsl" type="text/xsl"?>
	

 

API XSLT Java 1.4

 

import javax.xml.transform.stream.*;
import javax.xml.transform.*;

class XSLT {

  public static void main(String args[]){
    String xslt=args[0];
    String xml =args[1];
    try{
      TransformerFactory tFactory = TransformerFactory.newInstance();

      Transformer transformer = 
		tFactory.newTransformer(new StreamSource(xslt));

      transformer.transform(new StreamSource(xml), 
			    new StreamResult(System.out));

    }
    catch (Exception e){
      e.printStackTrace();
    }
  }

}



 

XQuery

 

http://www.w3.org/TR/xquery


 

FLWR Expressions

 

Flower expressions : For Let Where Return

for Variable in Exp 
where Exp return Exp sortby(Exp)

let Variable := Exp 
where Exp return Exp sortby(Exp)


 

FLWR Expressions

 

<publisher_list>
     {for $p in distinct-values(document("bib.xml")//publisher)
      return
          <publisher>
              <name> {$p/text()} </name> 
              {for $b in document("bib.xml")//book[publisher = $p]
                  return
                     <book>
                        {$b/title}
                        {$b/price}
                     </book> 
                  sortby(price descending)
              }
          </publisher> 
      sortby(name)
     }
</publisher_list>


 

Type expression

 

element of type animal

typeswitch($animal)
	case element duck return xx
	case element dog  return yy


 

XLink : XML Linking Language

 

http://www.w3.org/TR/xlink


 

XLink

 

 <a xmlns:xlink='http://wwww.w3.org/1999/xlink' 
   xlink:type='simple' 
   xlink:href='students.xml'
   xlink:title='Student List' 
   xlink:show='new'
   xlink:actuate='onRequest'>

Current List of Students

</a>

 

Liens étendus

 


 

Lien étendu : Exemple

 

Lien étendu :

<sitelist xlink:type='extended'>

Avec une ressource locale et un locator soft :

<local xlink:type='resource' xlink:label='soft' xlink:title='Mon Super Soft'>
	Description locale
</local>

<loc xlink:type='locator' xlink:label='soft' 
	xlink:href='http://..here.xml' xlink:title='Super Soft'/>

et deux locators server :

<loc xlink:type='locator' xlink:label='server'
	xlink:href='http://..s1.xml' xlink:title='Chez moi'/>

<loc xlink:type='locator' xlink:label='server' 
	xlink:href='http://..s2.xml' xlink:title='Chez eux'/>

Une description d'arc entre soft et server :

<go xlink:type='arc' xlink:from='soft' xlink:to='server'/>

</sitelist>

 

Attributs de comportement

 

affichage du document cible

xlink:show 
	(new |    -- nouvelle fenetre ou frame
	replace | -- charger la ressource dans la même fenêtre
	embed |   -- prend la place du lien dans le document source
	other |   -- d'autres attributs peuvent donner des indications
	none)     -- pas d'indications  

parcours du lien

xlink:actuate 
	(onLoad |     -- au chargement du document
	onRequest |   -- à la demande de l'utilisateur (click, etc.)
	other |       -- indications possibles dans d'autres attributs
	none)         -- pas d'indication

 

XPointer Framework

 

http://www.w3.org/TR/xptr-framework


 

XPointer : Exemple

 

Element d'ID intro :

http://www.ybroc.org#intro

3ème fils du 2ème fils de l'élément d'ID intro

element(intro/2/3)