Jump to content
  • entries
    69
  • comments
    18
  • views
    6047

Une histoire X - 5e partie : L'exportation XML de FileMaker Pro

Sign in to follow this  
David Julot

493 views

Suite de la semaine dernière, où je vous ai lâchement abandonné en cours de route. Je vais donc poursuivre cette semaine par la réalisation d’une feuille de style de transformation (XSL-T) pour exporter les données d’une base FileMaker.

Je vais continuer à utiliser la base d’exemple, que vous trouverez dans les fichiers joints à cette chronique.

Concernant l’écriture de code XML, vous avez deux possibilités :

  • La première : utiliser un éditeur texte, mais en faisant attention à ne pas saisir de caractères accentués;
  • La seconde : utiliser un éditeur adapté à l’écriture de code XML. Pour ma part j’utilise le logiciel oXygene XML Editor, qui a le bon goût de fonctionner aussi bien sur Mac OS X que sur Windows. Cliquez ici pour accéder au site de l’éditeur.

 

Notre première feuille XSL-T

Nous allons commencer par créer une feuille XSL-T. Ce document doit comporter au moins deux éléments :

  • La déclaration XML, puisque qu’un document XSL-T est avant tout un document XML;
  • La balise racine, qui indique, entre autre, que c’est un document XSL-T.

Voici donc la feuille XSL-T minimaliste :

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  ...
</xsl:stylesheet>

Je ne vous ai pas encore parlé de l’espace de nom (name space) et pourtant c’est une notion très importante. Je ne vais pas rentrer dans le détail, vais il faut savoir que le parser, le moteur de transformation, va jouer avec trois documents XML : le document XML à transformer, le document XSL-T et le document XML résultat de la transformation. Rappelez vous ce schéma vu la semaine dernière (cf. chronique 4) :

sch_ma04.jpg

Il est peut arriver qu’une balise ayant le même nom se retrouve dans les trois documents, ou seulement deux. Il faut alors que le parser puisse savoir que telle balise vient de tel document et pas d’un autre. Pour cela on utilise l’espace de nom, un préfixe qui va permettre au parser de connaître l’origine de la balise, un peu à la manière des clefs primaires dans les bases de données.

Nous avons donc deux espaces de nom à déclarer :

  • Le premier, xsl, déclaré par l’attribut xmlns:xsl="" ;
  • Le deuxième, fmp, déclaré par l’attribut xmlns:fmp="".

Le nom fmp est choisit, n’est pas imposé. Par contre, l’adresse fournit en valeur doit correspondre exactement à celle fournit par le document XML de la grammaire FMPDSORESULT.

Ces préfixes seront placés devant (et pour cause c’est un préfixe!) chaque balise de la feuille XSL-T.

Voici donc le code correspondant à la feuille XSL-T de base pour une transformation d’une grammaire FMPDSORESULT :

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fmp="http://www.filemaker.com/fmpdsoresult"
  version="1.0">
...
</xsl:stylesheet>


Vous trouverez cette feuille jointe à cette chronique sous le titre « Feuille XSL-T de base », ainsi que l’exportation au format XML de la base sous le titre « export FMPDSORESULT ».

 

Le principe de modèle de données

Il faut savoir que la transformation XSL-T consiste à appliquer un modèle de données à une arborescence XML. Pour cela, on utilise la commande XSL xsl:template, ce qui nous donne le code suivant :

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fmp="http://www.filemaker.com/fmpdsoresult"
  version="1.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="fmp:FMPDSORESULT">
    ...
  </xsl:template>
</xsl:stylesheet>

La commande xsl:template va dire au parser d’appliquer un modèle de données (inexistant pour le moment) pour la balise FMPDSORESULT rencontré dans le document XML à transformer.

On souhaite, par exemple, avoir un document XML ayant l’arborescence suivante :

<CONTACTS>
  <CONTACT>
    <NOM>nom du contact</NOM>
    <PRENOM>prénom du contact</PRENOM>
  </CONTACT>
  ...
</CONTACTS>

Nous aurons alors le modèle de données suivant :

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fmp="http://www.filemaker.com/fmpdsoresult"
  version="1.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="fmp:FMPDSORESULT">
    <CONTACTS>
      <CONTACT>
        <NOM></NOM>
        <PRENOM></PRENOM>
      </CONTACT>
    </CONTACTS>
  </xsl:template>
</xsl:stylesheet>

Mais comment insérer la valeur de la rubrique nom dans la balise NOM ? Mais avec la fonction xsl:value-of ! Mais avant cela, il faut connaître le chemin pour atteindre la balise nom dans le document à transformer. Regardons-le d’un peu plus près :

<?xml version="1.0" encoding="UTF-8" ?><!-- Cette grammaire n'est plus utilisée et a été remplacée par FMPXMLRESULT. -->
<FMPDSORESULT xmlns="http://www.filemaker.com/fmpdsoresult">
  <ERRORCODE>0</ERRORCODE>
  <DATABASE>base.fp7</DATABASE>
  <LAYOUT />
  <ROW MODID="1" RECORDID="1">
    <genre>M.</genre>
    <nom>Henri</nom>
    <prenom>Martin</prenom>
    <adresse>23 boulevard de l’écluse</adresse>
    <code_postal>38120</code_postal>
    <ville>Saint-Chéron</ville>
  </ROW>
  ...

Le chemin est le suivant : FMPDSORESULT > ROW > nom

Mais comme nous avons demandé au parser d’appliquer un modèle de données pour la balise FMPDSORESULT, alors le chemin se limite à ROW > nom.

Nous obtenons donc le code suivant :

<xsl:stylesheet   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fmp="http://www.filemaker.com/fmpdsoresult"
  version="1.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="fmp:FMPDSORESULT">
    <CONTACTS>
      <CONTACT>
        <NOM>
          <xsl:value-of select="fmp:ROW/fmp:nom" />
        </NOM>
        <PRENOM>
          <xsl:value-of select="fmp:ROW/fmp:prenom" />
        </PRENOM>
      </CONTACT>
    </CONTACTS>
  </xsl:template>
</xsl:stylesheet>

C’est bien, mais le fichier résultat ne génère qu’un document XML avec uniquement les données du premier enregistrement. C’est normal, nous n’avons pas indiqué au parser qu’il doit répéter autant de fois qu’il y a de balises ROW le bloc CONTACT. Pour cela, nous allons utiliser la commande xsl:for-each, et nous obtenons le code suivant :

<xsl:stylesheet   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fmp="http://www.filemaker.com/fmpdsoresult"
  version="1.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="fmp:FMPDSORESULT">
    <CONTACTS>
      <xsl:for-each select="fmp:ROW">
        <CONTACT>
          <NOM>
            <xsl:value-of select="fmp:nom" />
          </NOM>
          <PRENOM>
            <xsl:value-of select="fmp:prenom" />
          </PRENOM>
        </CONTACT>
      </xsl:for-each>
    </CONTACTS>
  </xsl:template>
</xsl:stylesheet>

Et voilà votre première feuille de style de transformation XSL-T. Pour ceux qui ne savent plus comment la mettre en œuvre, je vous invite à revoir le chapite 4 et plus précisément la dernière procédure…

Vous trouverez en annexe la feuille XSL-T finale, avec le fichier CONTACTS.XML résultat de la transformation du fichier FMPDSORESULT.XML.

 

C’est tout pour aujourd’hui !

Voilà la petite série sur XML et XSL-T terminée. J’espère que vous n’aurez plus peur devant ces termes… En attendant je vous souhaite une excellente semaine à toutes et à tous.

Sign in to follow this  


0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...