XML - TP

Maîtrise TAL



home

contact

outils

xml

xslt

xpath


 

 

XSLT


Tp n°6 : Corpus ArbreStenose



Explications:
Créez 2 feuilles de styles XSl-t qui recopie une instance de document Xml.
Pour reproduire en sortie un document au format xml, il est nécessaire de le préciser. L'élément " xsl :output " permet de préciser le format de sortie, la version et l'encodage. L'attribut " indent " permet d'avoir un affichage où les données balises sont indentées.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

2° façon de copier
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates/> </xsl:copy>
</xsl:template>

<xsl:template match="arbres">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>

Dans cette variante, les attributs ne sont pas copiés.
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>

Créez une feuille style pour enlever un sous arbre.
Pour cela il suffit simplement de copier l'intégralité du document en appliquant un modèle vide au sous arbre visé, ici " art ".
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="art">
</xsl:template>
</xsl:stylesheet>

Créez une feuille style pour remonter un sous arbre.
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="art">
<xsl:apply-templates select="sn"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>

Créez une feuille style pour simplifier récursivement les arbres.
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="sadj|det">
<xsl:apply-templates select="sn"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

Créez une feuille style pour extraire les terminaux, les pré-terminaux, les noms.
<xsl:template match="@*|node()">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="arbre">
<xsl:text>
</xsl:text>
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="nom">
<xsl:copy-of select=".">

Créez une feuille style pour extraire un sous arbre de type donné.
De dépendances élémentaires à des associations pivot / contexte élémentaire.

Cette feuille de style transforme l'arbre d'une instance de document Xsl.. Elle utilise deux nouvelles instructions de traitement : " xsl :element " et " xsl :attribute ". Elles permettent respectivement de créer des nouveaux éléments et attributs dans le document résultat. Ainsi l'arbre du document de sortie sera très différent de celui de l'instance de document de départ.

Schéma type de l'arbre du document de départ
<arbres>
<arbre phrase="1" arbre="1">
<sn>
<sn>
<nom>aide</nom>
</sn>
<sadj>
<adj>européen</adj>
</sadj>
</sn>
</arbre>
</arbres>

Schéma type de l'arbre du document d'arrivée
<associations>
<association phrase="1" arbre="1" patron="*n adj">
<pivot>aide</pivot>
<contexte>~ européen</contexte>
</association>
<association phrase="1" arbre="1" patron="n adj*">
<pivot>européen</pivot>
<contexte>aide ~</contexte>
</association>
</associations>

Le passage de l'un à l'autre repose sur une feuille de style Xsl. Le format de sortie est " Xml " comme l'indique le prologue
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes"/>

La première partie de la feuille définit un modèle général dans lequel sera mis le contenu. La valeur de cet élément est donnée par " apply-templates select ="arbres/arbre" ". L'élément est clos "
</xsl :element>
<xsl:template match="/">
<xsl:element name="associations">
<xsl:apply-templates select="arbres/arbre"/>
</xsl:element>
</xsl:template>

La création de l'arbre résultat est défini par un test " test="sn/sp" ". La réussite de ce test entraîne l'application du modèle. Celui crée des nouveaux éléments et attributs. La création en sortie d'un document Xml implique que la feuille de style respecte le standard Xml, c'est à dire que les balises soient fermées et que l'imbrication des éléments soit respectée (pas de chevauchement). Ces pourquoi lorsqu'un élément (ou un attribut) est défini (<xsl :element name= "association ") on retrouve à la fin de cette définition une balise de clôture (</xsl :element>). L'élément " association " a quatre attributs :phrase, arbre, patron, prep. La valeur de ces attributs est soit une valeur rentrée directement dans le modèle (" <xsl:text>*n prep n</xsl:text> ") ou une référence à un noeud de l'arbre de départ. Par exemple, " <xsl:value-of select="@phrase"/> " fait référence à la valeur de l'attribut " phrase " du nœud " arbre ". L'élément " association " a deux éléments : " pivot " et " contexte " dont les valeurs sont extraites de l'arbre de départ.
<xsl:template match="arbre">
<xsl:if test="sn/sp">
<xsl:element name="association">
<xsl:attribute name="phrase"> <xsl:value-of select="@phrase"/> </xsl:attribute>
<xsl:attribute name="arbre"> <xsl:value-of select="@arbre"/> </xsl:attribute>
<xsl:attribute name="patron"> <xsl:text>*n prep n</xsl:text> </xsl:attribute>
<xsl:attribute name="prep"> <xsl:value-of select="sn/sp/prep"/> </xsl:attribute>
<xsl:element name="pivot"> <xsl:value-of select="sn/sn/nom"/> </xsl:element>
<xsl:element name="contexte">
<xsl:text>~ </xsl:text> <xsl:value-of select="sn/sp/prep"/>
<xsl:text> </xsl:text> <xsl:value-of select="sn/sp/sn/nom"/> </xsl:element>
</xsl:element>

Il existe deux types d'éléments " association ". Le suivant se distingue du premier par :
- une valeur différente de l'attribut " patron " : " n prep n* " au leu de "*n prep n "
- une valeur différente de l'élément " pivot ", désigné par le chemin " sn/sp/sn/nom " au lieu de " sn/sn/nom "
- une valeur différente de l'élément " pivot ", désigné par les valeurs " sn/sn/nom sn/sp/prep~ " au lieu de " ~ sn/sp/prep sn/sp/sn/nom "
<xsl:element name="association">
<xsl:attribute name="phrase"> <xsl:value-of select="@phrase"/> </xsl:attribute>
<xsl:attribute name="arbre"> <xsl:value-of select="@arbre"/> </xsl:attribute>
<xsl:attribute name="patron"> <xsl:text>n prep n*</xsl:text> </xsl:attribute>
<xsl:attribute name="prep"> <xsl:value-of select="sn/sp/prep"/> </xsl:attribute>
<xsl:element name="pivot"> <xsl:value-of select="sn/sp/sn/nom"/> </xsl:element>
<xsl:element name="contexte">
<xsl:value-of select="sn/sn/nom"/> <xsl:text> </xsl:text>
<xsl:value-of select="sn/sp/prep"/> <xsl:text> ~</xsl:text> </xsl:element>
</xsl:element>
</xsl:if>
Le second test reprend le même schéma pour le modèle. Le test porte sur " sn/sadj ".
L'élément " association " a quatre attributs :phrase, arbre, patron, prep. La valeur de ces attributs est soit une valeur rentrée directement dans le modèle (" <xsl:text>*n adj</xsl:text> ") ou une référence à un noeud de l'arbre de départ. L'élément " association " a deux éléments : " pivot " et " contexte " dont les valeurs sont extraites de l'arbre de départ. " Pivot " et " contexte " présente alternativement la valeur du mot et de l'adjectif associé.
<xsl:if test="sn/sadj">
<xsl:element name="association">
<xsl:attribute name="phrase"> <xsl:value-of select="@phrase"/> </xsl:attribute>
<xsl:attribute name="arbre"> <xsl:value-of select="@arbre"/> </xsl:attribute>
<xsl:attribute name="patron"> <xsl:text>*n adj</xsl:text> </xsl:attribute>

<xsl:element name="pivot"> <xsl:value-of select="sn/sn/nom"/> </xsl:element>
<xsl:element name="contexte"> <xsl:text>~ </xsl:text> <xsl:value-of select="sn/sadj/adj"/> </xsl:element>

</xsl:element>

<xsl:element name="association">
<xsl:attribute name="phrase"> <xsl:value-of select="@phrase"/> </xsl:attribute>
<xsl:attribute name="arbre"> <xsl:value-of select="@arbre"/> </xsl:attribute>
<xsl:attribute name="patron"> <xsl:text>n adj*</xsl:text> </xsl:attribute>
<xsl:element name="pivot"> <xsl:value-of select="sn/sadj/adj"/> </xsl:element>
<xsl:element name="contexte"> <xsl:value-of select="sn/sn/nom"/> <xsl:text> ~</xsl:text> </xsl:element>
</xsl:element>
</xsl:if>
</xsl:template>

XML

XSLT

XPATH