% $Id: slides.tex,v 1.5 2004/03/02 13:09:14 bortzmeyer Exp $

% Mise au point
\documentclass[a4,landscape,article]{seminar}
%\documentclass[a4,landscape,article,slidesonly]{seminar}

% Impression réelle
%\documentclass[a4,landscape,slidesonly]{seminar}

%%%%%%%%%%

\usepackage[latin1]{inputenc}
\usepackage{fancybox}
\usepackage[slides]{afnic}
\usepackage[french, english]{babel}

\newpagestyle{MH}%
  {XML\hfil\thepage}
  {AFNIC\hfil{}Stéphane Bortzmeyer}
\slidepagestyle{MH}

\epsfslidesize

\pagestyle{empty}

\title{XML~: vision générale}
\author{Stéphane Bortzmeyer \\
\url{<bortzmeyer@nic.fr>}}
\date{2 Mars 2004}

\begin{document}

\begin{slide}
\maketitle
\addtocounter{slide}{-1}
\slidepagestyle{empty}
\end{slide}

\begin{slide}
\addtocounter{slide}{-1}
 Ce document est distribué sous les termes de la GNU Free
      Documentation License \url{http://www.gnu.org/licenses/licenses.html#FDL}. Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.2
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
\end{slide}

\begin{slide}
\heading{XML se répand partout}

Utilisations ``texte'' :

\begin{itemize}
\item documentation (DocBook, \rfc{2629}),
\item format de fichiers (OpenOffice).
\end{itemize}

Utilisations ``données'' :

\begin{itemize}
\item fichiers de configuration (ZoneCheck, plug-in de qualification),
\item protocoles pour les registres (EPP, IRIS),
\item protocole pour "middleware" (XML-RPC),
\end{itemize}

\end{slide}

Tous les projets de logiciel libre font maintenant leur documentation
en XML (sauf Python).

Dans le monde IETF, voir le \rfc{3470}.

Mais tout le monde n'est pas d'accord :
\url{http://bitmover.com/pipermail/lmbench-users/2003-November/000076.html}
ou \url{http://xmlsucks.org/} ou encore \url{http://c2.com/cgi/wiki?XmlSucks}.

Ironie : XML était prévu pour le Web et normalisé par le W3C mais est
peu utilisé pour le Web.

\begin{slide}
\heading{Les bases de XML}

XML est un méta-langage (les vrais langages ou \textbf{vocabulaires}
sont Docbook, FO, SVG, TEI, \ldots).

XML est un cadre pour faire des formats de fichier.

Pas un langage de programmation.

Le modèle de données est hiérarchique.

XML était un sous-ensemble de SGML (mais c'est moins vrai désormais).

\end{slide}

À cause de cette notion de vocabulaire, il est difficile de dire ``je
connais XML'' si on ne connais que DocBook.

\begin{slide}
\heading{La soupe de sigles XML}

XML, XSLT, XSL-FO, Xpath, Xlinks, Xpointer, W3C Schema, Relax NG, DTD,
Xquery, SVG, XHTML, SOAP, RSS, RDF, \ldots

\end{slide}

\begin{slide}
\heading{La syntaxe}
Dans un document XML, il y a des \textbf{éléments} (qui ont parfois
des \textbf{attributs}) emboîtés. 

Les éléments peuvent être vides,
contenir d'autres éléments ou bien du texte.

Les noms des éléments sont définis par le vocabulaire.

\begin{info}
  <domain holder='AR41-NIC'>
     <name>example.fr</name>
     <active/>
  </domain>
\end{info}

Sans la connaissance du vocabulaire, un document XML ne sert pas à
grand'chose (sauf vocabulaire trivial).

\end{slide}

C'est pour cela que ce n'est pas parce qu'une application produit du
XML qu'elle est ouverte. 

GFDL : ``Examples of suitable formats for Transparent copies include
plain ASCII without markup, Texinfo input format, LaTeX input format,
SGML or XML using a publicly available DTD\ldots''

\begin{slide}
\heading{Les \foreign{namespaces}}
Si on veut mélanger des éléments de plusieurs vocabulaires.
% TODO: meilleur exemple! doc: ou bien Dublin Core
\begin{info}
  <afnic:domain holder='AR41-NIC'>
     <afnic:name>example.fr</afnic:name>
     <afnic:active/>
     <inpi:mark final='1'>123456789</inpi:mark>
  </afnic:domain>
\end{info}
Les préfixes des espaces de noms (ici, ``afnic'' et ``inpi'') sont
définis par un URI (\rfc{3305}). C'est l'URI qui compte, \textbf{pas} le préfixe :
\begin{info} 
<afnic:domain holder='AR41-NIC' 
         xmlns:afnic="http://www.afnic.fr/Confiance" >
     <afnic:name>example.fr</afnic:name>
     <afnic:active/>
     <inpi:mark final='1' xmlns:inpi="urn:INPI">123456789</inpi:mark>
  </afnic:domain>
\end{info}

Les \foreign{namespaces} rendent la validation difficile.

% TODO: validation et extraction en XSL

\end{slide}

\begin{slide}
\heading{Conformité}

Les niveaux de conformité d'un document XML :

\begin{enumerate}
\item \textbf{bien formé} : syntaxiquement correct, les marques fermantes
  correspondent aux entrantes. Ne dépend pas du vocabulaire.
\item \textbf{valide} : obéit à un vocabulaire précis.
\item \textbf{correct par rapport aux règles ``métier''} : pour
l'instant, ce niveau n'est pas formellement traité par XML.
\end{enumerate}

Ce document n'est pas bien formé :
\begin{info}
  <debut>
  <milieu>
  </debut>
\end{info}
\end{slide}

Un document XML \textbf{doit} être bien formé. XML, en raison de la
catastrophe d'HTML, rompt avec le principe ``Etre libéral dans ce
qu'on reçoit, \ldots''

\begin{slide}
\heading{Validité}
Ce document DocBook est bien formé mais n'est pas valide.
\begin{info}
<article>
  <para>Title should come first.</para>
  <title>Bad example</title>
</article>
\end{info}

On peut utiliser un éditeur qui guide pour ne produire que des
documents valides (Emacs+psgml, Emacs+nxml, \ldots).

On peut vérifier a posteriori (réception de XML par le réseau : \textbf{sécurité}).

\end{slide}

OpenReg ne semble pas valider les éléments EPP...

\begin{slide}
\heading{Décrire les règles}

Décrire un langage au dessus de XML (DTD, W3C schémas et Relax NG).

On peut aussi le faire informellement.

C'est un travail de \textbf{modélisation} (donc pas purement
mécanique).

\end{slide}

\begin{slide}
\heading{Document Type Definition}
Une DTD décrit la composition des éléments.

\begin{info}
<!ELEMENT domain (fqdn,nameservers)>
<!ATTLIST domain holder IDREF #REQUIRED>
<!ELEMENT nameserver (name,ipaddress?)>
<!ELEMENT nameservers (nameserver)+> 
<!ELEMENT fqdn (#PCDATA)>
<!ELEMENT name (#PCDATA)>
\end{info}

Les DTD sont hérités de SGML.

Leur syntaxe est non-XML.

Aucun typage possible (cf. règle LDH dans l'élément \computer{name} ci-dessus).

Beaucoup d'outils pour DTD.

\end{slide}

\begin{slide}
\heading{Un document conforme à cette DTD}

\begin{info}
  <domain holder="PL1">
    <fqdn>foobar.example</fqdn>
    <nameservers>
      <nameserver>
         <name>ns1.example.com</name>
      </nameserver>
      <nameserver>
          <name>ns2.example.com</name>
      </nameserver>
    </nameservers>
  </domain>
\end{info}

\end{slide}

\computer{ipaddress} est optionnelle.

Insister sur l'absence de typage (entiers positifs, etc).

\begin{slide}
\heading{Identifiants}

Pour trouver la DTD d'un document XML, on utilise les
identifiants :

\begin{itemize}
\item publics,
\item système.
\end{itemize}

\begin{info}
<!DOCTYPE zone PUBLIC "-//Generic NIC//DTD DNS Registry V1.0"
     "http://www.gennic.net/registry.dtd">
\end{info}

Les catalogues permettent de trouver un nom de fichier à partir d'un
identifiant.

\end{slide}

\begin{slide}
\heading{Vérifier avec une DTD}
\begin{info}
nsgmls -s -wxml /usr/share/sgml/declaration/xml.dcl example.xml
\end{info}

\begin{info}
xmllint --valid --noout example.xml
\end{info}

\end{slide}

Le premier outil, partie du paquetage sp, traite SGML. Le second,
partie du paquetage libxml2, ne traite que XML.

\begin{slide}
\heading{W3C schémas}
Un des langages de schémas mais pas le seul.

Normalisé par le W3C.

Syntaxe XML.

Comme une DTD, un W3C schéma décrit la composition des éléments.

Très riche, notamment pour le typage.

Sépare la description de la structure et celle du contenu.

Utilisé dans plusieurs protocoles Internet comme EPP ou IRIS.

Peu d'outils (trop complexe ?).

\end{slide}

\begin{slide}
\heading{Exemple de W3C schema, EPP}

\begin{info}
    <element name="epp" type="epp:eppType"/>
...
  <complexType name="greetingType">
    <sequence>
      <element name="svID" type="epp:sIDType"/>
      <element name="svDate" type="dateTime"/>
      <element name="svcMenu" type="epp:svcMenuType"/>
    </sequence>
  </complexType>
\end{info}
\end{slide}

\begin{slide}
\heading{Xerces}

Une vérification d'un schéma avec Xerces (validateur d'Apache) :
\begin{info}
% perl DOMPrint.pl -v=always -n -s personal-schema.xml > /dev/null
Error in eval: ERROR:
FILE:    /home/bortzmeyer/tmp/personal-schema.xml
LINE:    9
COLUMN:  12
MESSAGE: Not enough elements to match content model : 
                      '(name,email*,url*,link,link,link?)'
 at DOMPrint.pl line 131
 at DOMPrint.pl line 132
\end{info}
% TODO: tester avec le schéma d'EPP

\end{slide}

\begin{slide}
\heading{Relax NG}
Un autre langage de schéma, très populaire dans le monde du logiciel
libre.

Normalisé dans le cadre d'Oasis.

Syntaxe XML ou ``compacte''.

Relax décrit des motifs, auxquels un document valide doit se conformer
(cf. expressions rationnelles).

Moins riche pour le typage que les W3C schémas.

On peut traduire du Relax en DTD ou en W3C schémas.

Déjà des outils.

\end{slide}

\begin{slide}
\heading{Exemple de schéma Relax NG}

\begin{info}
<element name="addressBook" xmlns="http://relaxng.org/ns/structure/1.0">
  <zeroOrMore>
    <element name="card">
      <element name="name">
        <text/>
      </element>
      <element name="email">
        <text/>
      </element>
    </element>
  </zeroOrMore>
</element>
\end{info}
\end{slide}

\begin{slide}
\heading{Exemple Relax NG en syntaxe compacte}

\begin{info}
  element addressBook {
  element card {
    element name { text },
    element email { text }
  }*
}

\end{info}
%TODO: vérification avec Relax
\end{slide}

\begin{slide}
  \heading{Quel outil choisir ?}

Ne pas oublier que Trang peut traduire de n'importe quel
langage de schéma en presque n'importe quel autre.

Ou bien utiliser un fichier XML d'exemple comme définition du
vocabulaire (Examplotron).

\end{slide}

\begin{slide}
\heading{XSLT}

XSLT est un langage de transformation de documents XML :

\begin{itemize}
\item en documents XML d'un autre vocabulaire,
\item ou en documents texte (BIND, LaTeX, *roff, etc).
\end{itemize}

Normalisé par le W3C, écrit en XML.
\end{slide}
Insister : XSLT n'est pas une feuille de style et ne connait rien à la
présentation.

\begin{slide}
\heading{Exemple XSLT}
Traduction de bibliographie \rfc{2629} en bibliographie utilisant la
DTD du NIC générique :
\begin{info}
  <xsl:template match="reference">
    <xsl:variable name="id">
              <xsl:value-of select="substring-after(@anchor,'RFC')"/>
    </xsl:variable>
   <rfc><xsl:attribute name="num">
            <xsl:value-of select="$id"/></xsl:attribute>
     <xsl:apply-templates select="front/author"/>
    <xsl:text>&#10;</xsl:text>
     <xsl:apply-templates select="front/title"/>
    <xsl:text>&#10;</xsl:text>
     <xsl:apply-templates select="front/date"/>
    <xsl:text>&#10;</xsl:text>
   </rfc>
\end{info}

\computer{select} prend comme argument une expression Xpath.

\end{slide}

\begin{slide}
\heading{Autre exemple XSLT}

Traduction d'un document XML d'un registre en fichier de zone BIND :

\begin{info}
  <xsl:template match="/zone/domain">
    <xsl:for-each select="nameservers/nameserver">
      <xsl:value-of select="../../fqdn"/>.  IN    NS   <xsl:value-of select="name"/>.
      <xsl:variable name="name"><xsl:value-of select='name'/></xsl:variable>
      <!-- Add the glue records, if necessary -->
      <xsl:if test="substring($name, 2 + string-length($name) - 
                                         string-length('$tld')) = $tld">
	<xsl:text>&#10;</xsl:text>
	<xsl:value-of select="$name"/>.  IN    A   <xsl:value-of select="ipaddress"/>
      </xsl:if>
      <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
    <xsl:text>&#10;</xsl:text>
  </xsl:template>
\end{info}

\end{slide}

\begin{slide}
\heading{XSLT en pratique}
Implémentations : cela a pris du temps mais il en existe désormais
beaucoup d'excellentes en logiciel libre.

xsltproc (libxml2), xalan, sablotron, 4suite, \ldots

Un exemple un peu tordu. La FAQ du service de surveillance des TLD
(écrit en Mason) du
NIC générique est écrite en XML (DTD QAML). Un processeur XSLT est
appelé par Mason pour afficher la FAQ (rassurez-vous, il y a un
cache). Cocoon permet de faire encore pire.
\end{slide}

\begin{slide}
\heading{Usine à gaz avec XSLT}
\begin{info}
<% $stylesheet->output_string($results) %>

<%init>
my $results = $stylesheet->transform($source);
</%init>

<%once>
use XML::LibXSLT;
use XML::LibXML;

my $prefix = "/var/www/www.generic-nic.net/dyn/mon";

my $parser = XML::LibXML->new();
my $xslt = XML::LibXSLT->new();

my $source = $parser->parse_file("$prefix/faq.xml");
my $style_doc = $parser->parse_file("$prefix/faq.xsl");

my $stylesheet = $xslt->parse_stylesheet($style_doc);

</%once>
\end{info}

\end{slide}

\begin{slide}
\heading{Attaque par programme}

XSLT n'est pas obligatoire pour faire des transformations.

On peut aussi utiliser un programme en \foreign{name your favorite
language here}.

Plusieurs API :

\begin{itemize}
\item celle de l'analyseur expat, bâtie sur des événements (début
d'élément, fin d'élément, \ldots),
\item SAX (Simple API for XML), également bâtie sur des événements mais pas les mêmes,
\item DOM (Document Object Model), bâti sur un modèle hiérarchique du
document.  
\end{itemize}

\end{slide}

\begin{slide}
\heading{Exemple SAX}
On stocke uniquement les textes et on les affiche à chaque fin
d'élément.

\begin{info}
    public void characters(char[] content, int start, int len) {   
        while (len-- > 0) {
            appendChar (content[start++]);
        }
    }

    public void endElement (String name) {
        flushChars();
    }   
    
    public void endDocument() {
        flushChars();
    }
    
\end{info}
\end{slide}
\begin{slide}
\heading{Exemple DOM}
\computer{Node} est le type essentiel en DOM. C'est un n\oe{}ud de
l'arbre XML.

On regarde tous les éléments de premier niveau (fils de la racine),
puis on cherche l'infomation dans leurs fils :
\begin{info}
  for node in tree.documentElement.childNodes:
    if node.nodeType == Node.ELEMENT_NODE:
        if node.nodeName == "member":
            for element in node.childNodes:
                if element.nodeName == "name":
                    name = element.childNodes[0].nodeValue
                elif element.nodeName == "ip":
                    ip = element.childNodes[0].nodeValue
\end{info}
\end{slide}

Insister : avec le langage X et DOM, on peut faire tout ce que fait
XSLT.

Rappeler que le modèle de données de XML est hiérarchique.

\begin{slide}
\heading{Créer du XML}

On peut créer du XML :

\begin{itemize}
\item avec vi,
\item avec un programme qui fait du
\computer{printf("<foobar>\ldots},
\item avec un programme qui s'appuie sur DOM ou sur une autre API qui
  guide la génération de XML,
\item avec un éditeur qui aide (mode psgml d'emacs ou nxml - mode
  Relax de Clark),
\end{itemize}

\end{slide}

Avec l'approche printf, il faut échapper les caractères spéciaux. Et
il faut faire attention à produire du XML valide. 

\begin{slide}
\heading{Quelques langages (ou vocabulaires)}

Des exemples pris au hasard...

\end{slide}

\begin{slide}
\heading{FO (Formatting Objects)}
Un langage de description de page.

Normalisé W3C.

Concurrent de PDF ou de Postscript.

Pas encore d'imprimantes FO :-(

On utilise souvent XSLT pour produire du FO à partir de Docbook ou de
TEI.

\begin{info}
<fo:block space-before.optimum="1em">
Since we are using the XML version of DocBook, here is how to
call <fo:simple-link internal-destination="jade">jade</fo:simple-link> 
to translate 
<fo:inline-sequence
font-family="monospace">myfile.db</fo:inline-sequence> 
to TeX:</fo:block>
\end{info}

Pour faire du PDF à partir de FO : FOP.
\end{slide}

\begin{slide}
\heading{SVG, Scalable Vector Graphics}
Un langage de description d'images.

Normalisé W3C.

Concurrent de Flash ou de FIG.

\begin{info}
<rect x="0" y="0" width="1" height="1" style="stroke:none;fill:white;"/>
<polygon points="1.4998,1.0002 586.5,1.0002 586.5,325 1.4998,325 " 
       style="stroke:#a5dbff;stroke-width:0;fill:#a5dbff;"/>
\end{info}

Mozilla supporte SVG.

\end{slide}

\begin{slide}
\heading{DocBook}
Une vocabulaire très riche et très complexe pour les documentations
techniques.

Normalisé Oasis.

Utilisé par quasiment tous les projets de logiciel libre.

Documentations :

\begin{info}
<para><replaceable>nameservers</replaceable> is the exhaustive
list of nameservers that are primary or secondary for the zone,
they are separated by a semicolon, [...] a comma-separated list of
IP addresses. For example: 
<literal>ns1.toto.fr=192.168.1.5,192.168.1.6;ns2.toto.fr</literal> 
</para>
\end{info}

Articles :

\begin{info}
<para>Le domaine est donc assez miné, et le
vocabulaire complexe (<xref linkend="unicode.glossary"/>).</para>
\end{info}
\end{slide}

\begin{slide}
\heading{Désigner des éléments : Xpath}

Syntaxe non-XML pour désigner une partie d'un document XML. Une sorte
de grep \foreign{XML-aware}.

\computer{/foo/bar} : tout fils nommé \computer{bar} d'un élément \computer{foo}
de premier niveau.

\computer{//contact[@handle="SB1"]} : tout élément (quel que soit son niveau) \computer{contact} qui a un
attribut \computer{handle} dont la valeur est SB1.

Serveur whois du NIC générique, dorsal XML :

\begin{info}        
        # Use XPath in the DOM tree to find the domain
        result = Evaluate("/zone/domain[fqdn=\"" + \
                 string.lower(domain) + "\"]",
                          xml_dom_object.documentElement)
\end{info}


On trouve une bibliothèque Xpath dans toutes les bonnes bibliothèques
XML.

\end{slide}

\begin{slide}
\heading{Liens : Xlinks}
Liens simples, analogues à ceux de HTML.

Ou liens riches, bi-directionnels ou vers un ensemble, pas juste un
point.

Un \foreign{namespace} et des attributs standards.

Aucun navigateur Web ne les accepte ?

\begin{info}
<report xmlns:xlink="http://www.w3.org/1999/xlink"
      xlink:type="simple"
      xlink:href="http://www.free.fr/~example/report.txt">
 ...
\end{info}
\end{slide}

\begin{slide}
\heading{Xpointers}
Xpath + URI.

Permettent de pointer vers l'intérieur d'un document, sans modifier ce
dernier.

Pointer vers le troisième paragraphe du document \computer{doc.xml} :


\texttt{http://exa.fr/foutoir/doc.xml\#xpointer(\textbf{/para[position()=3])}}

Peuvent s'utiliser dans des Xlinks.

\end{slide}

Les avocats de l'IPR vont encore trouver un moyen d'interdire Xpath !
(Liens ``profonds''.)

\begin{slide}
\heading{Encodage XML: les services Web}
Pas grand'chose à dire : XML ne sert que pour l'encodage.

Le programmeur ne voit pas de XML.
\end{slide}

\end{document}
