Techniques de R éé criture et Transformations Pierre-Etienne Moreau
Application à XML
Document XML XML permet de d é crire des documents structur é s Paul Mark Jurgen Julien Pierre On peut voir un document XML comme un arbre
Transformation de documents XML On a envie de pouvoir manipuler ces donn é es pour y rechercher de l ’ information pour g é n é rer de nouveaux documents (HTML, LaTeX, PDF, XML, etc.) Quels sont les outils permettant de le faire XSLT / XPath Xquery Xduce / Cduce DOM … Peu permettent de manipuler un document XML en Java Les manipulations se font souvent en utilisant DOM directement
Exemple On veut savoir s ’ il existe un noeud de la forme Julien Paul Mark Jurgen Julien Pierre
Filtrage Il faut savoir si un pattern XML filtre vers un noeud de document XML On aimerait pouvoir é crire %match(t) { Julien -> { // Noeud trouv é } Ou plus g é n é ralement : X -> { … }
Mod è le de donn é e (simplifi é ) ElementNode(name:str, attrList:TNodeList, childList:TNodeList) -> TNode AttributeNode(name:str, value:str) -> TNode TextNode(data:str) -> TNode conc(TNode*) -> TNodeList
XML vs. Term Un document XML peut se voir comme un arbre est repr é sent é par : ElementNode("A", conc(AttributeNode("a", "at1")), conc(ElementNode("B",conc(),conc())) )
Pattern XML On veut pouvoir é crire un pattern de la forme X qui sera encod é par : ElementNode("A", conc(AttributeNode("a", "at1")), conc(X) )
Questions A-t-on : X ? Quel est le type de X ? TNode ? TNodeList ? On voudrait pouvoir é crire X* Quelles sont les solutions ?
Questions En fonction du parseur, peut être reconnu comme A-t-on : X ? X* ? Comment est encod é ? ElementNode("A", conc(AttributeNode("a", "at1")), conc( TextNode(" "), ElementNode("B",conc(),conc()), TextNode(" ")) ) Est-ce que cela filtre ?
Notation explicite (_*,X,_*) qui correspond à : conc(_*,X,_*) A-t-on (_*,X,_*) ? Oui, il y a 3 solutions
Notation implicite (_*,X,_*) qui correspond à : [X] qui correspond é galement à X A-t-on X ? Oui, il y a 3 solutions
Attributs Les attributs sont repr é sent é s par une liste de couples (nom,valeur) Il existe é galement des notations implicites et explicites Ainsi : correspond à qui correspond à
Questions A-t-on : ? Pourquoi ? car ? A-t-on : ? Non, car : (_*, a="at1", _*, b="at2", _*) !<< (b="at2", a="at1") Il faudrait du filtrage AC avec é l é ment neutre!
Attributs dans Tom On consid è re un ordre sur les noms d ’ attributs et les formes canoniques o ù les attributs sont tri é s Ainsi, est repr é sent é par ElementNode("A", conc(AttributeNode("a", "at1"), AttributeNode("b", "at2")), conc()) De même, pour les motifs
Utilisation dans Tom Node sort(Node subject) { %match(subject) { (X1*,p1,X2*,p2,X3*) -> { if(`compare(p1,p2) > 0) { return sort(`xml( X1* p2 X2* p1 X3* )); } return subject; }
Comparaison d ’ attributs int compare(Node t1, Node t2) { %match(t1, t2) { n1, n2 -> { return `a1.compareTo(`a2); } } return 0; }