| Modèle nommé renvoyant une valeur |
<xsl:template name="xxx">
<xsl:param name="yyy"/>
<xsl:param name="zzz"/>
<xsl:variable name="result">
... corps de la "fonction" ici ...
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template> |
| Appel du modèle nommé renvoyant une valeur |
<xsl:variable name="result-xxx">
<xsl:call-template name="xxx">
<xsl:with-param name="yyy" select="..."/>
<xsl:with-param name="zzz" select="..."/>
</xsl:call-template>
</xsl:variable> |
| Fonction index-of |
<!-- renvoie l'indice du début de 'testString' dans 'aString' -->
<!-- renvoie -1 si 'aString' ne contient pas 'testString' -->
<xsl:template name="index-of">
<xsl:param name="aString"/>
<xsl:param name="testString"/>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test=" contains( $aString, $testString ) ">
<xsl:variable name="string-Before">
<xsl:value-of
select="substring-before( $aString, $testString )" />
</xsl:variable>
<xsl:value-of select="1+string-length( $string-Before )" />
</xsl:when>
<xsl:otherwise>
-1
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template> |
| Appel de la fonction index-of |
<!-- indice de la première apostrophe dans 'stringToSplit' -->
<xsl:variable name="indexOf-firstApos">
<xsl:call-template name="index-of">
<xsl:with-param name="aString" select="$stringToSplit"/>
<xsl:with-param name="testString" select='"'"'/>
</xsl:call-template>
</xsl:variable>
<!-- indice du premier espace dans 'stringToSplit' -->
<xsl:variable name="indexOf-firstSpace">
<xsl:call-template name="index-of">
<xsl:with-param name="aString" select="$stringToSplit"/>
<xsl:with-param name="testString" select='" "'/>
</xsl:call-template>
</xsl:variable>
... |
| Modèle nommé réalisant une action |
<xsl:template name="instancier-xxx">
<xsl:param name="yyy"/>
<xsl:param name="zzz"/>
... corps du modèle de transformation ici ...
</xsl:template> |
| Action instancier-bourre |
<!-- 'bourre' : le caractère de rembourrage avec l'espace comme valeur par défaut -->
<xsl:template name="instancier-bourre">
<xsl:param name="bourre" select="' '"/>
<xsl:value-of select="$bourre" />
</xsl:template> |
| Modèle nommé réalisant la répétition d'une action |
<xsl:template name="iter-instancier-xxx">
<xsl:param name="n"/>
<xsl:param name="..."/>
<xsl:if test="$n > 0">
<xsl:call-template name="instancier-xxx">
<xsl:with-param name="..." select="..."/>
</xsl:call-template>
<xsl:call-template name="iter-instancier-xxx">
<xsl:with-param name="n" select="$n - 1"/>
<xsl:with-param name="..." select="..."/>
</xsl:call-template>
</xsl:if>
</xsl:template> |
| Modèle nommé réalisant la répétition d'une action |
<xsl:template name="iter-instancier-xxx">
<xsl:param name="n"/>
<xsl:param name="..."/>
<xsl:if test="$n > 0">
<!-- instancier ici directement des instructions XSLT -->
<xsl:call-template name="iter-instancier-xxx">
<xsl:with-param name="n" select="$n - 1"/>
<xsl:with-param name="..." select="..."/>
</xsl:call-template>
</xsl:if>
</xsl:template> |
| itérations.xsl |
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method='text' encoding='ISO-8859-1' />
<xsl:template name="instancier-bourre">
<xsl:param name="bourre"/>
<xsl:value-of select="$bourre" />
</xsl:template>
<xsl:template name="iter-instancier-bourre">
<xsl:param name="n"/>
<xsl:param name="bourre"/>
<xsl:if test="$n > 0">
<xsl:call-template name="instancier-bourre">
<xsl:with-param name="bourre" select="$bourre"/>
</xsl:call-template>
<xsl:call-template name="iter-instancier-bourre">
<xsl:with-param name="n" select="$n - 1"/>
<xsl:with-param name="bourre" select="$bourre"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="/">
<xsl:call-template name="iter-instancier-bourre">
<xsl:with-param name="n">7</xsl:with-param>
<xsl:with-param name="bourre">.</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet> |
| Résultat |
....... |
| Récupération du flux de sortie dans une variable |
<xsl:template match="/">
<xsl:variable name="rembourrage">
<xsl:call-template name="iter-instancier-bourre">
<xsl:with-param name="n">7</xsl:with-param>
<xsl:with-param name="bourre">.</xsl:with-param>
</xsl:call-template>
</xsl:variable>
... utilisation de la variable $rembourrage ...
</xsl:template> |
| Itération Piez |
<xsl:for-each select="$NS[ position() < $n+1 ]" >
<xsl:call-template name="instancier-xxx">
<xsl:with-param name="..." select="..."/>
</xsl:call-template>
</xsl:for-each> |
document('')//node() |
| itérations.xsl |
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method='text' encoding='ISO-8859-1' />
<xsl:variable name="PuitsDeNoeuds" select="document('')//node()"/>
<xsl:template name="instancier-bourre">
<xsl:param name="bourre"/>
<xsl:value-of select="$bourre" />
</xsl:template>
<xsl:template name="iter-instancier-bourre">
<xsl:param name="n"/>
<xsl:param name="bourre"/>
<xsl:for-each select="$PuitsDeNoeuds[ position() < $n+1 ]" >
<xsl:call-template name="instancier-bourre">
<xsl:with-param name="bourre" select="$bourre"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template match="/">
<xsl:call-template name="iter-instancier-bourre">
<xsl:with-param name="n">7</xsl:with-param>
<xsl:with-param name="bourre">.</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet> |
| Résultat |
....... |
| nombreEspaces( str ) = |
0 si la chaîne str ne contient auncun espace; 1 + nombreEspaces( substring-after( str, ' ') ) sinon. |
| Fonction nombreEspaces( str ) |
<xsl:template name="nombreEspaces">
<xsl:param name="str"/>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test="contains( $str, ' ' ) ">
<xsl:variable name="nombreEspaces-recursif">
<xsl:call-template name="nombreEspaces">
<xsl:with-param name="str"
select="substring-after( $str, ' ')"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="1 + $nombreEspaces-recursif" />
</xsl:when>
<xsl:otherwise>
0
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result"/>
</xsl:template> |
| nombreEspaces( str, nombre-courant ) = |
nombre-courant si la chaîne str ne contient auncun espace; nombreEspaces( substring-after( str, ' '), nombre-courant + 1 ) sinon. |
| instancier-nombreEspaces( str, nombre-courant ), c'est : |
- instancier nombre-courant si la chaîne str ne contient auncun espace;
- instancier-nombreEspaces( substring-after( str, ' '), nombre-courant + 1 )
sinon. |
| Action instancier-nombreEspaces( str, nombre-courant ) |
<xsl:template name="instancier-nombreEspaces">
<xsl:param name="str"/>
<xsl:param name="nombre-courant" select="'0'"/>
<xsl:choose>
<xsl:when test="contains( $str, ' ' ) ">
<xsl:call-template name="instancier-nombreEspaces">
<xsl:with-param name="str"
select="substring-after( $str, ' ')"/>
<xsl:with-param name="nombre-courant"
select="1 + $nombre-courant"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$nombre-courant"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template> |
| NombreMots.xsl |
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.1"> <!-- compatibilité Saxon 6.5 -->
<xsl:output method='text' encoding='ISO-8859-1' />
<xsl:template name="nombreEspaces">
<xsl:param name="str"/>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test="contains( $str, ' ' ) ">
<xsl:variable name="nombreEspaces-recursif">
<xsl:call-template name="nombreEspaces">
<xsl:with-param name="str"
select="substring-after( $str, ' ')"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="1 + $nombreEspaces-recursif" />
</xsl:when>
<xsl:otherwise>
0
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result"/>
</xsl:template>
<xsl:template name="instancier-nombreEspaces">
<xsl:param name="str"/>
<xsl:param name="nombre-courant" select="'0'"/>
<xsl:choose>
<xsl:when test="contains( $str, ' ' ) ">
<xsl:call-template name="instancier-nombreEspaces">
<xsl:with-param name="str"
select="substring-after( $str, ' ')"/>
<xsl:with-param name="nombre-courant"
select="1 + $nombre-courant"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$nombre-courant"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:variable name="complainteDuCharretier">
Pousser des charettes à longueur de journée réclame de l'énergie
</xsl:variable>
<xsl:template match="/">
<xsl:variable name="N1">
<xsl:call-template name="nombreEspaces">
<xsl:with-param name="str"
select="normalize-space($complainteDuCharretier)"/>
</xsl:call-template>
</xsl:variable>
Nombre de mots = <xsl:value-of select="1 + $N1"/>
<xsl:variable name="N2">
<xsl:call-template name="instancier-nombreEspaces">
<xsl:with-param name="str"
select="normalize-space($complainteDuCharretier)"/>
</xsl:call-template>
</xsl:variable>
Nombre de mots = <xsl:value-of select="1 + $N2"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet> |
| Résultat |
Nombre de mots = 10
Nombre de mots = 10 |
| instancier-resultat( ns, resultat-courant ), c'est : |
- instancier resultat-courant si ns est vide;
- instancier-resultat( ns[position() > 1],
resultat(
resultat-courant,
valeur(ns[position() = 1])
)
) sinon. |
| Maisons.xml |
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<maisons>
<maison id="1">
<RDC>
<cuisine surface='12m2'>
Evier inox. Mobilier encastré.
</cuisine>
<WC>
Lavabo. Cumulus 200L.
</WC>
<séjour surface='40m2'>
Cheminée en pierre. Poutres au plafond.
Carrelage terre cuite. Grande baie vitrée.
</séjour>
<bureau surface='15m2'>
Bibliothèque encastrée.
</bureau>
<garage/>
</RDC>
<étage>
<terrasse>Palmier en zinc figurant le désert.</terrasse>
<chambre surface='28m2' fenêtre='3'>
Carrelage terre cuite poncée.
<alcôve surface='8m2' fenêtre='1'>
Lambris.
</alcôve>
</chambre>
<chambre surface='18m2'>
Lambris.
</chambre>
<salleDeBains surface='15m2'>
Douche, baignoire, lavabo.
</salleDeBains>
</étage>
</maison>
<maison id="2">
<RDC>
<cuisine surface='12m2'>
en ruine.
</cuisine>
<garage/>
</RDC>
<étage>
<mirador surface="1m2">
Vue sur la mer. Idéal en cas de tempête.
</mirador>
<salleDeBains surface='15m2'>
Douche.
</salleDeBains>
</étage>
</maison>
<maison id="3">
<RDC>
<séjour surface='40m2'>
Les plaisirs ont choisi pour asile
Ce séjour agréable et tranquille.
Que ces lieux sont charmants
Pour les heureux amants.
</séjour>
</RDC>
<étage>
<chambre surface='17.5m2'>
Exposition plein sud.
</chambre>
</étage>
</maison>
</maisons> |
| fonction valeur() |
<xsl:template name="valeur">
<xsl:param name="unSingleton"/>
<xsl:variable name="result"> <!-- une surface -->
<xsl:variable name="surface" select="$unSingleton/attribute::surface"/>
<xsl:choose>
<xsl:when test="$surface">
<xsl:value-of select="substring-before( $surface, 'm' )" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="number('NaN')" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template> |
| fonction minimum() |
<xsl:template name="minimum">
<xsl:param name="v1"/>
<xsl:param name="v2"/>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test="string($v1) = 'NaN' and string($v2) = 'NaN'">
<xsl:value-of select="$v1" />
</xsl:when>
<xsl:when test="string($v1) = 'NaN'">
<xsl:value-of select="$v2" />
</xsl:when>
<xsl:when test="string($v2) = 'NaN'">
<xsl:value-of select="$v1" />
</xsl:when>
<xsl:when test="$v1 > $v2">
<xsl:value-of select="$v2" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$v1" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template> |
| SurfaceMini.xsl |
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method='text' encoding='ISO-8859-1' />
<!-- ============================================================== -->
<xsl:template name="valeur">
<xsl:param name="unSingleton"/>
<xsl:variable name="result"> <!-- une surface -->
<xsl:variable name="surface"
select="$unSingleton/attribute::surface"/>
<xsl:choose>
<xsl:when test="$surface">
<xsl:value-of select="substring-before( $surface, 'm' )"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="number('NaN')" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template>
<!-- ============================================================== -->
<xsl:template name="minimum">
<xsl:param name="v1"/>
<xsl:param name="v2"/>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test="string($v1) = 'NaN' and string($v2) = 'NaN'">
<xsl:value-of select="$v1" />
</xsl:when>
<xsl:when test="string($v1) = 'NaN'">
<xsl:value-of select="$v2" />
</xsl:when>
<xsl:when test="string($v2) = 'NaN'">
<xsl:value-of select="$v1" />
</xsl:when>
<xsl:when test="$v1 > $v2">
<xsl:value-of select="$v2" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$v1" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template>
<!-- ============================================================== -->
<xsl:template name="instancier-min">
<xsl:param name="unNodeSet" />
<xsl:param name="min-courant" />
<xsl:choose>
<xsl:when test="$unNodeSet">
<xsl:call-template name="instancier-min">
<xsl:with-param name="unNodeSet"
select="$unNodeSet[position() > 1]"/>
<xsl:with-param name="min-courant">
<xsl:call-template name="minimum">
<xsl:with-param name="v1" select="$min-courant"/>
<xsl:with-param name="v2">
<xsl:call-template name="valeur">
<xsl:with-param name="unSingleton"
select="$unNodeSet[position() = 1]"/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$min-courant" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- ============================================================== -->
<xsl:template match="/">
<xsl:variable name="surface-mini">
<xsl:call-template name="instancier-min">
<xsl:with-param name="unNodeSet" select="//*"/>
<xsl:with-param name="min-courant" select="1000000"/>
</xsl:call-template>
</xsl:variable>
Surface mini = <xsl:value-of select="$surface-mini" />m2
nature de la pièce = <xsl:value-of select="local-name(
//*[attribute::surface =
concat($surface-mini, 'm2')])" />
</xsl:template>
<!-- ============================================================== -->
<xsl:template match="text()"/>
</xsl:stylesheet> |
| Résultat |
Surface mini = 1m2
nature de la pièce = mirador |
| SurfaceHabitable.xsl |
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method='text' encoding='ISO-8859-1' />
<!-- ============================================================== -->
<xsl:template name="valeur">
<xsl:param name="unSingleton"/>
<xsl:variable name="result"> <!-- une surface -->
<xsl:variable name="surface"
select="$unSingleton/attribute::surface"/>
<xsl:choose>
<xsl:when test="$surface">
<xsl:value-of select="substring-before( $surface, 'm' )" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="number('NaN')" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template>
<!-- ============================================================== -->
<xsl:template name="Somme">
<xsl:param name="v1"/>
<xsl:param name="v2"/>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test="string($v1) = 'NaN' and string($v2) = 'NaN'">
<xsl:value-of select="$v1" />
</xsl:when>
<xsl:when test="string($v1) = 'NaN'">
<xsl:value-of select="$v2" />
</xsl:when>
<xsl:when test="string($v2) = 'NaN'">
<xsl:value-of select="$v1" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$v1 + $v2" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template>
<!-- ============================================================== -->
<xsl:template name="instancier-somme">
<xsl:param name="unNodeSet" />
<xsl:param name="somme-courante" />
<xsl:choose>
<xsl:when test="$unNodeSet">
<xsl:call-template name="instancier-somme">
<xsl:with-param name="unNodeSet"
select="$unNodeSet[position() > 1]"/>
<xsl:with-param name="somme-courante">
<xsl:call-template name="Somme">
<xsl:with-param name="v1"
select="$somme-courante"/>
<xsl:with-param name="v2">
<xsl:call-template name="valeur">
<xsl:with-param name="unSingleton"
select="$unNodeSet[position() = 1]"/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$somme-courante" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- ============================================================== -->
<xsl:template match="maison">
<xsl:variable name="surface-habitable">
<xsl:call-template name="instancier-somme">
<xsl:with-param name="unNodeSet" select=".//*"/>
<xsl:with-param name="somme-courante" select="0"/>
</xsl:call-template>
</xsl:variable>
Maison id = <xsl:value-of select="@id"/>
Surface habitable = <xsl:value-of select="$surface-habitable" />m2 />
</xsl:template>
<!-- ============================================================== -->
<xsl:template match="text()"/>
</xsl:stylesheet> |
| Résultat |
Maison id = 1
Surface habitable = 136m2 />
Maison id = 2
Surface habitable = 28m2 />
Maison id = 3
Surface habitable = 57.5m2 />
|
| Fonction renvoyant trois résultats x, y, z : |
<xsl:template name="truc">
<xsl:param name="..."/>
<xsl:variable name="result">
<x>
<xsl:value-of select="..." />
</x>
<y>
<xsl:value-of select="..." />
</y>
<z>
<xsl:value-of select="..." />
</z>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template>
<xsl:template match="...">
<xsl:variable name="a">
<xsl:call-template name="truc">
<xsl:with-param name="..." select="..."/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$a/x"/>
<xsl:value-of select="$a/y"/>
<xsl:value-of select="$a/z"/>
</xsl:template> |
| separateurs.xsl |
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method='text' encoding='ISO-8859-1' />
<xsl:template name="index-of">
<xsl:param name="aString"/>
<xsl:param name="testString"/>
<xsl:variable name="result">
<xsl:choose>
<xsl:when test=" contains( $aString, $testString ) ">
<xsl:variable name="string-Before">
<xsl:value-of
select="substring-before( $aString, $testString )" />
</xsl:variable>
<xsl:value-of select="1+string-length( $string-Before )" />
</xsl:when>
<xsl:otherwise>
-1
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template>
<xsl:template name="split-beforeAndAfter-firstSeparator">
<!-- separator = apostrophe ou espace -->
<xsl:param name="stringToSplit"/>
<!-- stringToSplit is space-normalized -->
<xsl:variable name="indexOf-firstApos">
<xsl:call-template name="index-of">
<xsl:with-param name="aString" select="$stringToSplit"/>
<xsl:with-param name="testString" select='"'"'/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="indexOf-firstSpace">
<xsl:call-template name="index-of">
<xsl:with-param name="aString" select="$stringToSplit"/>
<xsl:with-param name="testString" select='" "'/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="result">
<xsl:choose>
<!-- -->
<xsl:when test=" $indexOf-firstApos < $indexOf-firstSpace ">
<before>
<xsl:value-of select="substring( $stringToSplit, 1,
$indexOf-firstApos - 1 )" />
</before>
<separator>'</separator>
<after>
<xsl:value-of select="substring( $stringToSplit,
$indexOf-firstApos + 1 )" />
</after>
</xsl:when>
<!-- -->
<xsl:when test=" $indexOf-firstSpace < $indexOf-firstApos ">
<before>
<xsl:value-of select="substring(
$stringToSplit, 1,
$indexOf-firstSpace - 1 )" />
</before>
<separator><xsl:text> </xsl:text></separator>
<after>
<xsl:value-of select="substring(
$stringToSplit,
$indexOf-firstSpace + 1 )" />
</after>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:copy-of select="$result" />
</xsl:template>
<xsl:variable name="complainteDuCharretier">
Pousser des charettes à longueur de journée réclame de l'énergie !
</xsl:variable>
<xsl:variable name="pendule">
L'heure exacte.
</xsl:variable>
<xsl:template match="/">
<xsl:variable name="split1">
<xsl:call-template name="split-beforeAndAfter-firstSeparator">
<xsl:with-param name="stringToSplit"
select="normalize-space($complainteDuCharretier)"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="normalize-space($complainteDuCharretier)"/>
before = <xsl:value-of select="$split1/before"/>
separator = "<xsl:value-of select="$split1/separator"/>"
after = <xsl:value-of select="$split1/after"/>
<xsl:variable name="split2">
<xsl:call-template name="split-beforeAndAfter-firstSeparator">
<xsl:with-param name="stringToSplit"
select="normalize-space($pendule)"/>
</xsl:call-template>
</xsl:variable>
<xsl:text>
</xsl:text>
<xsl:value-of select="normalize-space($pendule)"/>
before = <xsl:value-of select="$split2/before"/>
separator = "<xsl:value-of select="$split2/separator"/>"
after = <xsl:value-of select="$split2/after"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet> |
| Résultat |
Pousser des charettes à longueur de journée réclame de l'énergie !
before = Pousser
separator = " "
after = des charettes à longueur de journée réclame de l'énergie !
L'heure exacte.
before = L
separator = "'"
after = heure exacte. |
| presentation.xml |
<?xml version="1.0" encoding="UTF-16" ?>
<presentation>
<pageDeTitre id="CoursXML.1" next="CoursXML.2">
<titrePresentation>Comprendre XML et XSL</titrePresentation>
<credit>
<groupeAuteurs>
<auteur>Philippe Drix</auteur>
<societe>OBJECTIVA</societe>
</groupeAuteurs>
</credit>
</pageDeTitre>
<pageStandard id="CoursXML.2" prev="CoursXML.1" next="CoursXML.3">
<titre level="1" id="CoursXML.2.Déroulement">
Déroulement du Cours</titre>
...
</pageStandard>
<plan id="CoursXML.3" prev="CoursXML.2" next="CoursXML.4"/>
<pageStandard id="CoursXML.4" prev="CoursXML.3" next="CoursXML.4.1">
<titre level="1" id="CoursXML.4.__XMLgeneral">
XML - Généralités </titre>
...
</pageStandard>
<pageStandard id="CoursXML.4.1" prev="CoursXML.4" next="CoursXML.4.2">
<titre level="2" id="CoursXML.4.1.__Langagesdebalisage">
Les langages de balisage </titre>
...
<bloc>
<figure src="ArbreXML_1" id="fig:ArbreXML_1.CoursXML.4.1">
<captionFigure>
Structure arborescente d'un document XML bien formé
</captionFigure>
</figure>
</bloc>
...
</pageStandard>
<pageStandard id="CoursXML.4.2" prev="CoursXML.4.1" next="CoursXML.5">
<titre level="2" id="CoursXML.4.2.__AQuoiSertXML">
A quoi peut servir XML ? </titre>
</pageStandard>
<pageStandard id="CoursXML.5" prev="CoursXML.4.2" next="CoursXML.6">
<titre level="1" id="CoursXML.5.__StructuredocumentXML">
Structure d'un document XML </titre>
...
<bloc>
Ces blocs juxtaposés ou imbriqués forment un arbre
<cfFigure cf="fig:ArbreXML_1.CoursXML.4.1"/>
comme tout document XML.
</bloc>
...
</pageStandard>
<pageStandard id="CoursXML.6" prev="CoursXML.5" next="CoursXML.7">
<titre level="2" id="CoursXML.6.__DTD">
Grammaire d'un document XML (DTD)
</titre>
...
</pageStandard>
<pageFin id="CoursXML.7" prev="CoursXML.6" />
</presentation> |
| presentation-new.xml |
<?xml version="1.0" encoding="ISO-8859-1"?>
<presentation>
<pageDeTitre id="CoursXML.1" next="CoursXML.2">
<titrePresentation>Comprendre XML et XSL</titrePresentation>
<credit>
<groupeAuteurs>
<auteur>Philippe Drix</auteur>
<societe>OBJECTIVA</societe>
</groupeAuteurs>
</credit>
</pageDeTitre>
<pageStandard id="CoursXML.2" prev="CoursXML.1" next="CoursXML.3">
<titre level="1" id="CoursXML.2.__">
Déroulement du Cours</titre>
...
</pageStandard>
<plan id="CoursXML.3" prev="CoursXML.2" next="CoursXML.4"/>
<pageStandard id="CoursXML.4" prev="CoursXML.3" next="CoursXML.5">
<titre level="1" id="CoursXML.4.__XMLgeneral">
XML - Généralités </titre>
...
</pageStandard>
<pageStandard id="CoursXML.5" prev="CoursXML.4" next="CoursXML.6">
<titre level="2" id="CoursXML.5.__Langagesdebalisage">
Les langages de balisage </titre>
...
<bloc>
<figure src="@src" id="fig:ArbreXML_1.CoursXML.5">
<captionFigure>
Structure arborescente d'un document XML bien formé
</captionFigure>
</figure>
</bloc>
...
</pageStandard>
<pageStandard id="CoursXML.6" prev="CoursXML.5" next="CoursXML.7">
<titre level="2" id="CoursXML.6.__AQuoiSertXML">
A quoi peut servir XML ? </titre>
</pageStandard>
<pageStandard id="CoursXML.7" prev="CoursXML.6" next="CoursXML.8">
<titre level="1" id="CoursXML.7.__StructuredocumentXML">
Structure d'un document XML </titre>
...
<bloc>
Ces blocs juxtaposés ou imbriqués forment un arbre
<cfFigure cf="fig:ArbreXML_1.CoursXML.5"/>
comme tout document XML.
</bloc>
...
</pageStandard>
<pageStandard id="CoursXML.8" prev="CoursXML.7" next="CoursXML.9">
<titre level="2" id="CoursXML.8.__DTD">
Grammaire d'un document XML (DTD)
</titre>
...
</pageStandard>
<pageFin id="CoursXML.7" prev="CoursXML.6"/>
</presentation> |
| Constitution de la table de correspondance |
<xsl:variable name="lesPages">
<pages>
<xsl:for-each select="/presentation/*">
<page>
<xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
<xsl:attribute name="newId">
<xsl:value-of select="position()"/>
</xsl:attribute>
</page>
</xsl:for-each>
</pages>
</xsl:variable> |
| Arbre généré lors de l'évaluation de cette variable |
<pages>
<page id="CoursXML.1" newId="1"/>
<page id="CoursXML.2" newId="2"/>
<page id="CoursXML.3" newId="3"/>
<page id="CoursXML.4" newId="4"/>
<page id="CoursXML.4.1" newId="5"/>
<page id="CoursXML.4.2" newId="6"/>
<page id="CoursXML.5" newId="7"/>
<page id="CoursXML.6" newId="8"/>
<page id="CoursXML.7" newId="9"/>
<pages> |
| Arbre généré lors de l'évaluation de cette variable |
<xsl:template name='instancier-newID'>
<xsl:param name='oldId'/>
<xsl:value-of select="$lesPages/pages/page[
attribute::id = $oldId
]/attribute::newId" />
</xsl:template> |
| Modification des attributs d'une pageStandard |
<xsl:template match='pageStandard'>
<pageStandard>
<xsl:variable name="NoSeq">
<xsl:call-template name='instancier-newID'>
<xsl:with-param name='oldId' select="@id" />
</xsl:call-template>
</xsl:variable>
<xsl:attribute name="id">CoursXML.<xsl:value-of select="$NoSeq" />
</xsl:attribute>
<xsl:attribute name="prev">CoursXML.<xsl:value-of select="$NoSeq - 1"/>
</xsl:attribute>
<xsl:attribute name="next">CoursXML.<xsl:value-of select="$NoSeq + 1"/>
</xsl:attribute>
...
</pageStandard>
</xsl:template> |
| Modification des attributs d'une pageStandard ou d'un plan |
<xsl:template match='pageStandard | plan'>
<xsl:element name="{local-name(.)}">
<xsl:variable name="NoSeq">
<xsl:call-template name='instancier-newID'>
<xsl:with-param name='oldId' select="@id" />
</xsl:call-template>
</xsl:variable>
<xsl:attribute name="id">CoursXML.<xsl:value-of select="$NoSeq" />
</xsl:attribute>
<xsl:attribute name="prev">CoursXML.<xsl:value-of select="$NoSeq - 1"/>
</xsl:attribute>
<xsl:attribute name="next">CoursXML.<xsl:value-of select="$NoSeq + 1"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template> |
| Modification des attributs d'une pageDeTitre |
<xsl:template match='pageDeTitre'>
<!-- idem sans l'attribut prev -->
</xsl:template> |
| Modification des attributs d'une pageFin |
<xsl:template match='pageDeTitre'>
<!-- idem sans l'attribut next -->
</xsl:template> |
| Mise en place de règles spécifiques pour les enfants d'une page |
<xsl:template match='titre'>
<titre>
...
</titre>
</xsl:template>
<xsl:template match='figure'>
<figure src="@src">
...
</figure>
</xsl:template>
<xsl:template match='cfFigure'>
<cfFigure>
...
</cfFigure>
</xsl:template> |
| Règle de recopie ramasse-tout |
<xsl:template match='*'>
<xsl:copy>
<xsl:apply-templates select='@*|node()' />
</xsl:copy>
</xsl:template> |
| renumeroter.xsl |
<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
version = "1.1"> <!-- compatibilité Saxon 6.5 -->
<xsl:output method='xml' encoding='ISO-8859-1' />
<xsl:variable name="lesPages">
<pages>
<xsl:for-each select="/presentation/*">
<page>
<xsl:attribute name="id"><xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:attribute name="newId"><xsl:value-of select="position()"/>
</xsl:attribute>
</page>
</xsl:for-each>
</pages>
</xsl:variable>
<xsl:template name='instancier-newID'>
<xsl:param name='oldId'/>
<xsl:value-of select="$lesPages/pages/page[
attribute::id = $oldId
]/attribute::newId" />
</xsl:template>
<xsl:template match='pageStandard | plan'>
<xsl:element name="{local-name(.)}">
<xsl:variable name="NoSeq">
<xsl:call-template name='instancier-newID'>
<xsl:with-param name='oldId' select="@id" />
</xsl:call-template>
</xsl:variable>
<xsl:attribute name="id">CoursXML.<xsl:value-of
select="$NoSeq" /></xsl:attribute>
<xsl:attribute name="prev">CoursXML.<xsl:value-of
select="$NoSeq - 1"/></xsl:attribute>
<xsl:attribute name="next">CoursXML.<xsl:value-of
select="$NoSeq + 1" /></xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match='pageDeTitre'>
<xsl:element name="{local-name(.)}">
<xsl:variable name="NoSeq">
<xsl:call-template name='instancier-newID'>
<xsl:with-param name='oldId' select="@id" />
</xsl:call-template>
</xsl:variable>
<xsl:attribute name="id">CoursXML.<xsl:value-of
select="$NoSeq" /></xsl:attribute>
<xsl:attribute name="next">CoursXML.<xsl:value-of
select="$NoSeq + 1" /></xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match='pageFin'>
<xsl:element name="{local-name(.)}">
<xsl:variable name="NoSeq">
<xsl:call-template name='instancier-newID'>
<xsl:with-param name='oldId' select="@id" />
</xsl:call-template>
</xsl:variable>
<xsl:attribute name="id">CoursXML.<xsl:value-of
select="$NoSeq" /></xsl:attribute>
<xsl:attribute name="prev">CoursXML.<xsl:value-of
select="$NoSeq - 1" /></xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match='titre'>
<titre>
<xsl:variable name="NoSeq">
<xsl:call-template name='instancier-newID'>
<xsl:with-param name='oldId'
select="parent::pageStandard/attribute::id" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="texteID" select='substring-after(@id, ".__")'/>
<xsl:attribute name="level">
<xsl:value-of select="@level" />
</xsl:attribute>
<xsl:attribute name="id">
<xsl:text>CoursXML.</xsl:text>
<xsl:value-of select="$NoSeq" />
<xsl:text>.__</xsl:text>
<xsl:value-of select="$texteID" />
</xsl:attribute>
<xsl:apply-templates/>
</titre>
</xsl:template>
<xsl:template match='figure'>
<figure src="@src">
<xsl:variable name="NoSeq">
<xsl:call-template name='instancier-newID'>
<xsl:with-param name='oldId'
select="ancestor::pageStandard/attribute::id"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="texteID" select='substring-before(@id, ".")' />
<xsl:attribute name="id">
<xsl:value-of select="$texteID" />
<xsl:text>.CoursXML.</xsl:text>
<xsl:value-of select="$NoSeq" />
</xsl:attribute>
<xsl:apply-templates/>
</figure>
</xsl:template>
<xsl:template match='cfFigure'>
<cfFigure>
<xsl:variable name="NoSeq">
<xsl:call-template name='instancier-newID'>
<xsl:with-param name='oldId'
select="substring-after(@cf, '.')"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="texteID" select='substring-before(@cf, ".")' />
<xsl:attribute name="cf">
<xsl:value-of select="$texteID" />
<xsl:text>.CoursXML.</xsl:text>
<xsl:value-of select="$NoSeq" />
</xsl:attribute>
</cfFigure>
</xsl:template>
<xsl:template match='*'>
<xsl:copy>
<xsl:apply-templates select='@*|node()' />
</xsl:copy>
</xsl:template>
</xsl:stylesheet> |
| Modifications pour utiliser la fonction d'extension nodeset |
<xsl:stylesheet
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan"
version = "1.0">
<xsl:template name='instancier-newID'>
<xsl:param name='oldId/>
<xsl:value-of select="xalan:nodeset($lesPages)/pages/page[
attribute::id = $oldId]/attribute::newId" />
</xsl:template> |
| Node-set des surfaces |
<xsl:variable name="x" select="/maison/RDC/*/attribute::surface"/> |
| Tests d'identité |
count( $NS1 | $NS2 ) = 1 generate-id( $NS1 ) = generate-id( $NS2 ) |
| Tests d'appartenance |
count( $N | $NS ) = count( $NS ) |
/maison/RDC/*/attribute::surface[
la valeur textuelle de . n'existe pas déjà dans le node-set en construction
] |
/maison/RDC/*/attribute::surface[
la valeur textuelle de . n'existe pas déjà dans un certain node-set NS
] |
/maison/RDC/*[ la valeur textuelle de ./attribute::surface n'existe pas déjà dans preceding-sibling::*/attribute::surface ]/attribute::surface |
| Création d'un node-set de surfaces toutes différentes |
/maison/RDC/*[ not( ./@surface = preceding-sibling::*/@surface ) ]/@surface |
<xsl:key name="groupesdeSurfacesParValeurs"
match="attribute::surface"
use="." /> |
//attribute::surface |
key('groupesdeSurfacesParValeurs', la valeur textuelle du nœud testé) |
key('groupesdeSurfacesParValeurs', .) |
key('groupesdeSurfacesParValeurs', .)[1] |
//attribute::surface[
. s'identifie à ( key('groupesdeSurfacesParValeurs', .)[1] )
] |
| Création d'un node-set de surfaces toutes différentes |
//attribute::surface[
generate-id() =
generate-id(
key('groupesdeSurfacesParValeurs', .)[1]
)
] |
| preceding-sibling::*[1] | Table | following-sibling::*[1] |