Tout d'abord, j'ai ajouté à l'élément header un attribut photo qui peut prendre les valeurs on ou off pour générer un header comportant respectivement une colonne de texte et une photo ou deux colonnes d'adresse (commode si je viens à partir à l'étranger). Bien sûr, c'est valable pour la version format pdf et xhtml.

Ensuite, j'ai produit mon cv en langue chinoise au format pdf. Cela m'a d'ailleurs compliqué sensiblement la vie. Comme je ne voulais conserver qu'une feuille de style pour gérer les 3 langues, j'ai eu un soucis avec le support du chinois sous latex : impossible de mettre des caractères accentués français dans les macros CJK... J'ai pour l'instant résolu le problème de manière radicale en bannissant les accents français dans tous mes liens hypertextes. Visiblement ce problème est connu et la solution serait l'instruction \texorpdfstring mais je n'ai pas encore eu le temps d'approfondir la chose. Une autre idée serait de parser le fichier xml avec, au hasard, python pour n'encapsuler les caractères que lorsque cela est nécessaire au lieu d'appeler systématiquement la macro CJK dans la feuille de style.

Enfin, pour des raisons de pagination, j'ai décidé d'organiser les rubriques Expériences Professionnelles, Formation Universitaire, Projets informatiques, Langues, Divers dans un ordre différent entre la version pdf et xhtml. Ce n'est normalement pas un soucis, XSLT sait trier des éléments mais cette instruction ne fonctionnait pas dans l'état actuel de ma feuille de style car je factorise certaines transformations (soit dit en passant, je pense que ce que j'ai eu une si bonne idée de faire mes feuilles de style de la sorte). Heureusement, Python m'a bien dépanné car entre approfondir une technologie qui ne m'est pas essentielle et faire la même chose à l'aide un petit programme simple et efficace ; j'avoue, j'ai choisi la deuxième option. C'est en contradiction avec l'état de l'art mais je trouve qu'XSLT devient rapidement complexe lorsqu'on essaye de comprendre les micro-subtilités de ce langage. Peut-être que cela s'est amélioré à ce niveau avec XSLT2.0 qui va sortir prochainement. Je n'ai pas encore pris le temps de me pencher dessus. Toujours est-il que techniquement, je devais simplement trier des noeuds xml par rapport à un attribut ou un sous élément défini préalablement. Voici donc le programme python en question :


import sys
import operator
from xml.dom import minidom


__doc__ = """
This is an ugly way to sort an xml file without using xslt

parse.py cv-<lang>.xml fileout.xml
"""
def main(args):
    if not args or ("-h" in args):
        print __doc__
        return

    xmldoc = minidom.parse(args[0])
    itemlist = xmldoc.getElementsByTagName('item0')

    tuplelist=[]

    for i in range(len(itemlist)):
        tuple = (i,int(itemlist[i].attributes["pos"].value))
        tuplelist.append(tuple)
        
    tuplelistsorted = sorted(tuplelist, key=operator.itemgetter(1))

    content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<cv version=\""+ args[0][3:5] + "\" mode=\"detail\"> \n"+xmldoc.getElementsByTagName('header')[0].toxml()+"\n"+ xmldoc.getElementsByTagName('post')[0].toxml()+"\n"

    for i in range(len(tuplelistsorted)):
        content = content + itemlist[tuplelistsorted[i][0]].toxml() + "\n"
    content = content + "\n"

    fic = open (args[1],'w')
    fic.write(content.encode("utf-8"))
    fic.close()

if __name__ == "__main__":
    main(sys.argv[1:])

En gros l'idée ce programme c'est de créer une liste de tuple que l'on ordonne puis on réimprime le document suivant cette nouvelle liste. Merci python!

UPDATE : ça bouge sur office et le xml, quelques sites à creuser sur Open XML et la future suite microsoft Office 2007.