Demande de formats ouverts... de la bureautique au XML interopérable

Nous avons été plusieurs à signer une lettre ouverte adressée à la Commission Européenne pour demander qu'on ne nous impose plus de formats fermés pour interagir avec ses services.

Cette lettre ne se limite pas seulement à critiquer l'usage systématique de formats de documents bureautiques propriétaires (feuilles Excel, textes en Word, etc.), mais pointer aussi la mise en place de systèmes logiciels spécifiques pour la communication entre les citoyens et la Commission Européenne qui ne respectent aucun standard ouvert, ou alors seulement pour mieux les contourner.

Un des exemples les plus exaspérants de la situation actuelle est fourni par les Grant Preparation Forms (GPF) qui doivent obligatoirement être remplis pour toute soumission d'un projet européen pour financement dans le cadre du FP7 : le format de ces GPF est du XML parfaitement valide, ce qui semble indiquer qu'il y avait bien une réelle volonté de la part de la Commission d'obtenir un format ouvert (on imagine le XML obligatoire dans le cahier des charges).

Cependant, cela fait une bonne dizaines d'années que j'explique aux décideurs qui veulent bien écouter que le XML per se ne garantit en aucun cas l'interopérabilité : on peut prendre n'importe quel document propriétaire, l'encoder en base 64 si on veut faire joli, et le caser dans une balise CDATA pour obtenir un document XML parfaitement valide... et parfaitement non interopérable. Il faut dire que certains de ces décideurs me regardaient ensuite bizarrement en me disant qu'ils ne savaient pas ce qu'est un CDATA mais que je devais sûrement me tromper, car on dit bien partout que XML est la base de l'interopérabilité... Un certain Mr B.G. avait même comparé XML à l'invention de l'imprimerie !

Et bien, une section CDATA, c'est une section qui peut apparaître partout où un caractère est admis dans un document XML, et elle est tout simplement ignorée par le parseur XML (on peut mettre ce que l'on veut à l'intérieur).

Maintenant, regardons de plus près dans les GPF. En voici un extrait :

 <?xml version="1.0"  encoding="UTF-8"?>
 <GPF type="CP" editorversion="1.0" 
         templateversion="1.0" 
         prefillerversion="1.0" 
         prefillername="GPF Prefiller FP7"
         protectlegalentity="0" except="">
 <Page name="A1 Our Project"
           type="Proposal"
           ProjectTypes="" id="A1">
 <Layout>
 <![CDATA[
 release 10.5;
 datawindow ( units=1 timer_interval=0 color=16777215 processing=0 
 print.printername=""  print.documentname=""  print.orientation=2 
 print.margin.left=24 print.margin.right=24 print.margin.top=24 
 print.margin.bottom=24 print.paper.size=0 print.paper.source=0
 print.canusedefaultprinter=yes selected.mouse=no)
 header(height=130 color="536870912" )
 summary(height=0 color="536870912" )
 footer(height=0 color="536870912" )
 detail(height=654 color="536870912" )
 table(column=(type=char(9) key=yes update=yes 
        updatewhereclause=no name=prop_number
        dbname="prop_number"  )
 column=(type=char(20) key=yes updatewhereclause=no 
              name=prop_acronym dbname="prop_acronym"  )
 column=(type=char(200) updatewhereclause=no
              name=prop_title dbname="prop_title"  )
 column=(type=long updatewhereclause=no
              name=total_duration dbname="total_duration"  )
 column=(type=char(36) updatewhereclause=no
              name=call_identifier dbname="call_identifier"  )
 column=(type=char(200) updatewhereclause=no
              name=free_keywords dbname="free_keywords"  )
 column=(type=char(2000) updatewhereclause=no
              name=abstract dbname="abstract"  )
 column=(type=char(30) updatewhereclause=no
              name=activity_code_1 dbname="activity_code_1"  )
 column=(type=char(30) updatewhereclause=no
              name=activity_code_2 dbname="activity_code_2"  )
 column=(type=char(30) updatewhereclause=no
              name=activity_code_3 dbname="activity_code_3"  )
 column=(type=date updatewhereclause=no
              name=start_date dbname="start_Date"  )
  update="ppo" updatewhere=0 updatekeyinplace=no
   sort="prop_number A, prop_acronym A"
 )
 ...
 import.xml()
 export.pdf(method=0 distill.customPostScript="0" xslfop.print="0" )
 export.xhtml()
 ]]>
 </Layout>
 <Data page="A1 Our Project">
 ...
 <![CDATA[
 ...
 ]]>
 </GPF>

Compris l'astuce ? Une fois enlevées les sections CDATA, il ne reste pratiquement plus rien des GPF, toute l'information est à l'intérieur des CDATA, dans un format utilisable seulement par un outil qui sait ce que ces données signifient ; et il n'y a qu'un seul outil, le logiciel propriétaire GPFEditor, disponible uniquement pour Windows, qu'on doit télécharger sur le site de la Commission.

Autant dire que le XML obligatoire dans le cahier des charges ne nous a pas bien avancés, voire pas fait avancer du tout dans la quête de l'interopérabilité.

Comme cet exemple le montre bien, mettre en place une véritable politique de standards ouverts nécessite un effort significatif : il ne suffit pas de se baser sur des buzzwords, trop facilement contournés par des artifices techniques, il faut de véritables compétences, et l'Europe se doit de les acquérir rapidement sous peine de continuer à dépenser des fortunes pour faire développer des logiciels et outils métier qui vont rester totalement fermés et non interopérables, malgré la volonté politique affichée.