Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

xslt fabriquer un sous arbre pour pouvoir le parser à nouveau ?

4 views
Skip to first unread message

Une Bévue

unread,
Feb 16, 2012, 12:41:52 PM2/16/12
to
je fais une recherche sur un fichier xml correspondant à mon carnet
d'adresse.
le but est de représenter en html le contenu du carnet d'adresse en 3
colonnes avec des lignes de couleurs alternées.

j'arrive très bien à faire ça quand la sélection des personnes se fait
sur un attribut "group" :

<xsl:if test="($mode = 'group')">
<div id="un">
<xsl:apply-templates select="people/person[@group=$group]"
mode="group_trois">
<xsl:sort select="name/text()" lang="{$lang}" data-type="text"
order="ascending" case-order="upper-first"/>
<xsl:with-param name="col" select="1"/>
<xsl:with-param name="col_parite" select="1"/>
</xsl:apply-templates>
</div>
<div id="zero">
<xsl:apply-templates select="people/person[@group=$group]"
mode="group_trois">
<xsl:sort select="name/text()" lang="{$lang}" data-type="text"
order="ascending" case-order="upper-first"/>
<xsl:with-param name="col" select="0"/>
<xsl:with-param name="col_parite" select="1"/>
</xsl:apply-templates>
</div>
<div id="deux">
<xsl:apply-templates select="people/person[@group=$group]"
mode="group_trois">
<xsl:sort select="name/text()" lang="{$lang}" data-type="text"
order="ascending" case-order="upper-first"/>
<xsl:with-param name="col" select="2"/>
<xsl:with-param name="col_parite" select="0"/>
</xsl:apply-templates>
</div>
</xsl:if>
</xsl:if>


mais quand je fais une recherche sur le nom de la personne ou sur une
partie d'un numéro de téléphone, par exemple, je ne vois pas trop
comment faire.

enfin, j'ai une idée, mais je ne sais pas comment l'implémenter.

ce que je suppute :

si la personne correspond au critère de recherche, je l'ajoute dans un
arbre "résultat" et ensuite je traite cet arbre comme je le faisait avant.

bon je prend un exemple concret, soit une recherche sur un des numéros
de téléphone, le xml est ainsi :
<person company="true" id="452D92BB-268C-11D8-B59C-000A95B14F2E"
image="/AB2Html/Images/company.png">
<name>Association Lacanienne Internationale</name>
<phones>
<phone type="work">01 42 60 14 43</phone>
<phone type="work fax">01 42 60 14 34</phone>
</phones>
<emails>
<email type="work">secre...@freud-lacan.com</email>
</emails>
<note>Bibliothèque : ma je 13h30 - 17h30
de pref. Le mardi</note>
</person>

si je recherche toutes les personnes qui ont 42 dans leur numéro de tél,
je dois ajouter celle-ci et d'autres, donc je voudrait créer un
"sous-arbre" résultat du genre :
<result>
<person ...>
<name>Association Lacanienne Internationale</name>
<phones>
<phone type="work">01 42 60 14 43</phone>
<phone type="work fax">01 42 60 14 34</phone>
</phones>
<emails>
<email type="work">secre...@freud-lacan.com</email>
</emails>
<note>Bibliothèque : ma je 13h30 - 17h30
de pref. Le mardi</note>
</person>
...
<person ...
...
</person>
</result>

et ensuite au lieu de faire comme précédemment :
<xsl:apply-templates select="people/person[@group=$group]" ...
je ferai quelque chose du genre :
<xsl:apply-templates select="/result/people/person" ...

mais voilà je ne sais pas comment copier les résultats de ma recherche
dans un arbre...

Alain Ketterlin

unread,
Feb 16, 2012, 12:57:35 PM2/16/12
to
Une Bévue <unbewu...@fai.invalid> writes:

[...]
> si la personne correspond au critère de recherche, je l'ajoute dans un
> arbre "résultat" et ensuite je traite cet arbre comme je le faisait
> avant.
[...]
> mais voilà je ne sais pas comment copier les résultats de ma recherche
> dans un arbre...

Franchement, je n'ai pas tout lu, mais il me semble que tu as un
problème avec les "result-tree-fragment".

Quand ta transformation produit un fragment de XML, ce fragment n'est
pas utilisable au même titre qu'un fragment du document initial. En
gros, tu ne peux en faire qu'une chose, c'est <xsl:copy> (de tête, il
faudrait vérifier dans le recommandation). Il y a une bonne raison
(technique) à celà, qui est d'éviter au préprocesseur d'avoir à parser
ce qu'il produit.

Encore une fois, EXSLT a pensé à cela. La fonction exsl:node-set()
(module common) permet de faire exactement ce qu'il te faut. Tu lui
passes le fragment (que tu as probablement mis dans une variable) et il
te renvoie un node-set. Tu peux ensuite appliquer tous les templates que
tu veux.

-- Alain.

Une Bévue

unread,
Feb 16, 2012, 2:09:25 PM2/16/12
to
Alain Ketterlin <al...@dpt-info.u-strasbg.fr> wrote:

> Encore une fois, EXSLT a pensé à cela. La fonction exsl:node-set()
> (module common) permet de faire exactement ce qu'il te faut. Tu lui
> passes le fragment (que tu as probablement mis dans une variable) et il
> te renvoie un node-set. Tu peux ensuite appliquer tous les templates que
> tu veux.

bon, j'essaie ça, avec copy-of aussi il peut y avoir une solution.

dans l'exemple fourni :
<http://www.exslt.org/exsl/functions/node-set/exsl.node-set.html>

le template agit sur le xml source pas sur la variable.

je peux changer ça ?

en fait je ne pige pas ce que vient faire :
<xsl:variable name="tree">
<a><b><c><d/></c></b></a>
</xsl:variable>


--
« Les conneries c'est comme les impôts,
on finit toujours par les payer. »
(Michel Audiard)

Alain Ketterlin

unread,
Feb 17, 2012, 3:18:48 AM2/17/12
to
unbewus...@fai.invalid (Une Bévue) writes:

> dans l'exemple fourni :
> <http://www.exslt.org/exsl/functions/node-set/exsl.node-set.html>
>
> le template agit sur le xml source pas sur la variable.

Dans le deuxième exemple, node-set s'applique à $tree, qui contient un
result-tree-fragment.

> en fait je ne pige pas ce que vient faire :
> <xsl:variable name="tree">
> <a><b><c><d/></c></b></a>
> </xsl:variable>

Cela construit un r-t-f dans la variable tree, que normalement XSLT ne
te permet pas de traiter. node-set($tree) transforme ce r-t-f en...
node-set "normal". Tu pourrais faire :

<xsl:apply-templates select="node-set($tree)"/>

ou toute variante.

-- Alain.

Une Bévue

unread,
Feb 17, 2012, 10:52:21 AM2/17/12
to
Le 17/02/2012 09:18, Alain Ketterlin a écrit :
> Cela construit un r-t-f dans la variable tree, que normalement XSLT ne
> te permet pas de traiter. node-set($tree) transforme ce r-t-f en...
> node-set "normal". Tu pourrais faire :
>
> <xsl:apply-templates select="node-set($tree)"/>

j'ai essayé count(node-set($tree)) ça m'a retourné 1...
?

Alain Ketterlin

unread,
Feb 17, 2012, 11:04:13 AM2/17/12
to
Une Bévue <unbewu...@fai.invalid> writes:

> Le 17/02/2012 09:18, Alain Ketterlin a écrit :
>> Cela construit un r-t-f dans la variable tree, que normalement XSLT ne
>> te permet pas de traiter. node-set($tree) transforme ce r-t-f en...
>> node-set "normal".
>
> j'ai essayé count(node-set($tree)) ça m'a retourné 1...
> ?

Il y a quoi dans $tree. Il faut qu'on cherche dans les messages
précédents pour savoir ?

http://www.w3.org/TR/xslt#section-Result-Tree-Fragments

explique la nature des result-tree-fragment, en particulier le noeud
racine qui chapeaute les noeuds du contenu.

-- Alain.

Une Bévue

unread,
Feb 18, 2012, 3:59:42 AM2/18/12
to
Le 17/02/2012 17:04, Alain Ketterlin a écrit :
> Il y a quoi dans $tree. Il faut qu'on cherche dans les messages
> précédents pour savoir ?
>
> http://www.w3.org/TR/xslt#section-Result-Tree-Fragments
>
> explique la nature des result-tree-fragment, en particulier le noeud
> racine qui chapeaute les noeuds du contenu.

de mémoire :

<xsl:variable name="tree">
<a><b><c><d><e/></d></c></b></a>
</xsl:variable>

j'ai essayé avec saxon.
0 new messages