🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: fr.comp.text.xml
7 messages
7 total messages Started by Une Bévue Thu, 16 Feb 2012 17:41
xslt fabriquer un sous arbre pour pouvoir le parser à nouveau ?
#256
Author: Une Bévue
Date: Thu, 16 Feb 2012 17:41
96 lines
4777 bytes
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">secretariat@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">secretariat@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...
Re: xslt fabriquer un sous arbre pour pouvoir le parser à nouveau ?
#257
Author: Alain Ketterlin
Date: Thu, 16 Feb 2012 17:57
30 lines
2467 bytes
Une Bévue <unbewusstsein@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.
Re: xslt fabriquer un sous arbre pour pouvoir le parser à nouveau ?
#258
Author: Une Bévue
Date: Thu, 16 Feb 2012 19:09
27 lines
2450 bytes
Alain Ketterlin <alain@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)
Re: xslt fabriquer un sous arbre pour pouvoir le parser à nouveau ?
#259
Author: Alain Ketterlin
Date: Fri, 17 Feb 2012 08:18
25 lines
2135 bytes
unbewusst.sein@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.
Re: xslt fabriquer un sous arbre pour pouvoir le parser à nouveau ?
#260
Author: Une Bévue
Date: Fri, 17 Feb 2012 15:52
9 lines
1760 bytes
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...
?
Re: xslt fabriquer un sous arbre pour pouvoir le parser à nouveau ?
#261
Author: Alain Ketterlin
Date: Fri, 17 Feb 2012 16:04
19 lines
2089 bytes
Une Bévue <unbewusstsein@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.
Re: xslt fabriquer un sous arbre pour pouvoir le parser à nouveau ?
#262
Author: Une Bévue
Date: Sat, 18 Feb 2012 08:59
16 lines
1964 bytes
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.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads