<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
  "/usr/share/xml/docbook/schema/dtd/4.4/docbookx.dtd">
<article>
  <articleinfo>
    <title>TD-8 : XSLT</title>
    <author>
      <firstname>Benoît</firstname>
      <surname>Valiron</surname>
    </author>
  </articleinfo>


  <sect1>
  <title>Un document KML</title>
    <para>
      Dans cette question on va manipuler un format XML utilisé par
      Google Map et Google Earth pour stocker des informations à
      dessiner sur une carte. L'espace de nom à utiliser est
      <code>http://earth.google.com/kml/2.1</code>.
    </para>
    <para>
      Un document KML qui trace une ligne brisée a la forme suivante :
      <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
  <Document>
    <Placemark>
      <name>Une ligne brisée</name>
      <LineString>
        <coordinates>
10.2,40.1
-0.9,50
10,48.33
        </coordinates>
      </LineString>
    </Placemark>
  </Document>
</kml>]]></programlisting>
      
      Les coordonnées prennent la forme
      <code>longitude,latitude</code> (sans espace après la virgule),
      et une ligne par défaut de couleur bleu et de trait
      d'épaisseur <code>4</code> relie chaque pair de points.
    </para>
    <para>
      On rappelle que la latitude est une mesure angulaire en degrés,
      elle varie entre la valeur 0° à l'équateur et 90° aux pôles. La
      longitude est une valeur angulaire, expression du positionnement
      est-ouest d'un point sur Terre. La longitude de référence est le
      méridien de Greenwich, qui passe par la France.
    </para>
    <para>
      Grenoble se trouve au point de latitude <code>45.2</code> et
      longitude <code>5.7</code>. Paris est à la latitude
      <code>49</code> et à la longitude <code>2.35</code>. Bordeaux
      est à la latitude <code>-0.5</code> et à la longitude
      <code>44.8</code>. Quel texte placeriez-vous à l'intérieur des
      balises <code>coordinates</code> pour tracer une ligne brisée
      reliant ces villes (dans l'ordre citée) ?
    </para>

  </sect1>

  <sect1>
    <title>KML et XSLT</title>
    <para>
      On considère le fichier suivant.
      <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<liste xmlns:g="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <titre>liste de villes</titre>
  <ville>
    <nom>Grenoble</nom>
    <g:lat>45.2</g:lat>
    <g:long>5.7</g:long>
  </ville>
  <ville>
    <nom>Paris</nom>
    <g:lat>49</g:lat>
    <g:long>2.35</g:long>
  </ville>
  <ville>
    <nom>Bordeaux</nom>
    <g:lat>44.8</g:lat>
    <g:long>-0.5</g:long>
  </ville>
</liste>]]></programlisting>
      <orderedlist>
      <listitem>
        <para>
          Donnez une expression XSLT qui produise le résultat demandé
          dans la question qui précède. Utiliser le modèle
          suivant&#160;:
      <programlisting><![CDATA[<xsl:stylesheet version='1.0'
           xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
           xmlns:g='http://www.w3.org/2003/01/geo/wgs84_pos#'>
  <xsl:output method="text" />
  
  <xsl:template match="/">
    <xsl:for-each select=" ..... ">
       ......
    </xsl:for-each>
  </xsl:template>
  
</xsl:stylesheet>]]></programlisting>
<!--
<xsl:stylesheet version='1.0'
                xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
                xmlns:g='http://www.w3.org/2003/01/geo/wgs84_pos#'>
  <xsl:output method="xml" />
  
  <xsl:template match="/">
    <xsl:for-each select="//ville">
      <xsl:value-of select="g:long"/>,<xsl:value-of select="g:lat"/>
      <xsl:text>
</xsl:text>
    </xsl:for-each>
  </xsl:template>
  
</xsl:stylesheet>
-->
        </para>
      </listitem>
      <listitem>
        <para>
          Transformez le modèle qui précède pour ne plus utiliser de
          balise <code>for-each</code>.
<!--
  <xsl:template match="//ville">
      <xsl:value-of select="g:long"/>,<xsl:value-of select="g:lat"/>
      <xsl:text>
</xsl:text>
  </xsl:template>
  <xsl:template match="text()"></xsl:template>
-->
        </para>
      </listitem>
      <listitem>
        <para>
          Donnez une feuille de style XSLT qui produit un document KML
          reliant les villes de la liste. N'oubliez-pas l'espace de
          noms du format KML. Utilisez un seul <code>template</code>
        </para>
      </listitem>
<!--
<xsl:stylesheet version='1.0'
                xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
                xmlns:g='http://www.w3.org/2003/01/geo/wgs84_pos#'>
  <xsl:output method="xml" />

  <xsl:template match="/">
  <kml xmlns="http://earth.google.com/kml/2.1">
  <Document>
    <Placemark>
      <name>Une ligne brisée</name>
      <LineString>
        <coordinates>
     <xsl:for-each select="//ville">
      <xsl:value-of select="g:long"/>,<xsl:value-of select="g:lat"/>
      <xsl:text>
</xsl:text>
     </xsl:for-each>
        </coordinates>
      </LineString>
    </Placemark>
  </Document>
</kml>

  </xsl:template>
  
</xsl:stylesheet>

-->
      <listitem>
        <para>
          Même question, avec plusieurs balises <code>template</code>
          mais sans balise <code>for-each</code>. De plus, placez le
          texte de la balise <code>titre</code> dans le champ
          <code>name</code> de la balise <code>Placemark</code>.
        </para>
<!--
<xsl:stylesheet version='1.0'
                xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
                xmlns:g='http://www.w3.org/2003/01/geo/wgs84_pos#'>
  <xsl:output method="xml" />

  <xsl:template match="/liste">
<kml xmlns="http://earth.google.com/kml/2.1">
  <Document>
    <Placemark>
      <name><xsl:value-of select="titre" /></name>
      <LineString>
        <coordinates>
          <xsl:apply-templates select="ville" />
        </coordinates>
      </LineString>
    </Placemark>
  </Document>
</kml>
  </xsl:template>

  <xsl:template match="ville">
      <xsl:value-of select="g:long"/>,<xsl:value-of select="g:lat"/>
      <xsl:text>
</xsl:text>
  </xsl:template>
  
</xsl:stylesheet>
-->
      </listitem>
    </orderedlist>
    </para>
  </sect1>
  
  <sect1>
    <title>XSLT et paramètres.</title>
    <para>
      <orderedlist>
      <listitem>
        <para>
          On veut écrire une transformation XSLT qui prend un document SVG
          sous la forme suivante en entrée:
          <programlisting><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="">
 <line x1="..." x2="..." y1="..." y2="..." />
 <line x1="..." x2="..." y1="..." y2="..." />
 ...
</liste>]]></programlisting>
          
          et qui produit un document KML en sortie qui dessine les
          lignes correspondantes. On placera une balise
          <code>Placemark</code> par balise <code>ligne</code>
          
        </para>
      </listitem>
      <listitem>
        <para>
          On veut maintenant autoriser la balise <code>polyline</code>
          de SVG. Comment feriez-vous pour cela ? Vous pouvez utiliser
          les fonctions <code>substring-before</code> et
          <code>substring-after</code> pour cela : créez deux
          <code>template</code>, un sans mode et un avec un mode nommé
          <code>progress</code>, qui reconnaissent tous les deux la
          balise <code>polyline</code>
          <programlisting><![CDATA[<template match="polyline">
  ...
</template>

<template match="polyline" mode="progress">
  <param name="chaine" />
  ...
</template>]]></programlisting>
          
          Le premier <code>template</code> appelle le deuxième avec
          <code>chaine</code> égal la liste des points. Le deuxième
          sépare la liste des points en deux&#160;: le premier point,
          qui est affiché, et la liste du reste des points, qui est
          placé en argument du <code>template</code> au mode
          <code>progress</code>.
        </para>
      </listitem>
      </orderedlist>
      
    </para>
  </sect1>
  
  
</article>

