[ XPath ] problème de détection d'un attribut.

problème de détection d'un attribut. [ XPath ] - Programmation

Marsh Posté le 22-07-2002 à 21:08:21    

'soir,
 
j'ai un petit souci avec une requête XPath à placer dans une page XSL...
 
je dois transformer un vieux document SGML en XML maison...
 
SGML à transformer:
 

Code :
  1. <table>
  2.    <col_info align="left"/>
  3.    <col_info align="right"/>
  4.    <line>
  5.       <col><para>blabla</para></col>
  6.       <col><para>blabla</para></col>
  7.    </line>
  8. </table>


 
doit devenir en XML:
 

Code :
  1. <table>
  2.    <tr>
  3.       <td align="left"><para>blabla</para></td>
  4.       <td align="right"><para>blabla</para></td>
  5.    </tr>
  6. </table>


 
j'ai écrit ceci:

Code :
  1. <td>
  2.   <xsl:attribute name="align">
  3.     <xsl:value-of select="parent::node()/parent::node()/col_info[position() = self::node()[position()]]/@align"/>
  4.   </xsl:attribute>
  5.   <xsl:apply-templates/>
  6. </td>


 
étant donné que le col en première position se réfère au col_info  en première position, le 2ème au 2ème et ainsi de suite...
 
(oui, ce SGML est pourri :D )
 
ma requête ne rapporte aucun résultat...
d'où ma question... est-ce que le self::node() pointe toujours sur l'élément courant càd le //col en cours ?
 
:jap:


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
Reply

Marsh Posté le 22-07-2002 à 21:08:21   

Reply

Marsh Posté le 22-07-2002 à 21:12:26    

en tapant tout ça, je me suis rendu compte d'une erreur:
ça me paraît plus correct comme ça:

Code :
  1. <xsl:value-of select="parent::node()/parent::node()/col_info[position() = position(self::node())]/@align"/>


 
mais ça ne fonctionne pas plus. :/


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
Reply

Marsh Posté le 23-07-2002 à 00:18:02    

hello,
 

Code :
  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <?xml-stylesheet type="text/xsl" href="essai.xsl"?>
  3. <table>
  4.   <col_info align="left"/>
  5.   <col_info align="right"/>
  6.   <line>
  7.      <col><para>blabla</para></col>
  8.      <col><para>blibli</para></col>
  9.   </line>
  10. </table>


 

Code :
  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <xsl:stylesheet
  3. version="1.0"
  4. xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5. <xsl:template match="/table">
  6. <html>
  7. <body>
  8. <table>
  9. <xsl:apply-templates select="line" />
  10. </table>
  11. </body>
  12. </html>
  13. </xsl:template>
  14. <xsl:template match="line">
  15. <tr>
  16.    <xsl:apply-templates select="col" />
  17. </tr>
  18. </xsl:template>
  19. <xsl:template match="col">
  20. <xsl:variable name="num">
  21.   <xsl:number count="col" />
  22. </xsl:variable>
  23. <td>
  24.   <xsl:attribute name="align">
  25.    <xsl:value-of select="/table/col_info[0+$num]/@align" />
  26.   </xsl:attribute>
  27.   <para>
  28.    <xsl:value-of select="para" />
  29.   </para>
  30. </td>
  31. </xsl:template>
  32. </xsl:stylesheet>


 
ça te plaît comme ça ?  :D

Reply

Marsh Posté le 23-07-2002 à 11:41:27    

:ouch:  
 
j'essaie de swit! :D
merci :jap:


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
Reply

Marsh Posté le 23-07-2002 à 15:13:59    

alors ça a résolu ton problème ?

Reply

Marsh Posté le 23-07-2002 à 16:16:05    

j'allais justement répondre. j'allais dire "Yes, Thanks" :)
 
cela étant, je ne comprends tjs pas pourquoi mon code ne passait pas  :sweat:  
 
mais ma page XSL avance :D


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
Reply

Marsh Posté le 23-07-2002 à 16:55:36    

ben donne tout ton code...
ça dépend du noeud ou tu te trouves...
faut faire gaffe avec les paramètres en xpath

Reply

Marsh Posté le 24-07-2002 à 08:56:23    

le code XSL transformant la table et sur le premier post.
il est juste placé dans <xsl:template match="col">
 
et ce template est bien détecté car il me crée les 'td' (donc 'col' est bien le noeud courant),  c'est juste que la requête XPath du value-of ne ramène rien. (il n'y a pas d'erreur de syntaxe sinon il le dirait)
 
en fait, je crois que c'est 'self::' qui est décalé...


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
Reply

Marsh Posté le 24-07-2002 à 09:35:15    

si tu veux utiliser position, remplaces ton XSL :
 

Code :
  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2.   <xsl:stylesheet
  3.    version="1.0"
  4.    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5.   <xsl:template match="/table">
  6.   <html>
  7.   <body>
  8.   <table>
  9.    <xsl:apply-templates select="line" />
  10.   </table>
  11.   </body>
  12.   </html>
  13.   </xsl:template>
  14.  
  15.   <xsl:template match="line">
  16.    <tr>
  17.      <xsl:apply-templates select="col" />
  18.    </tr>
  19.   </xsl:template>
  20.  
  21.   <xsl:template match="col">
  22.    <xsl:variable name="pos">
  23.     <xsl:value-of select="position()" />
  24.    </xsl:variable>
  25.    <td>
  26.     <xsl:attribute name="align">
  27.      <xsl:value-of select="/table/col_info[position()=$pos]/@align" />
  28.     </xsl:attribute>
  29.     <para>
  30.      <xsl:value-of select="para" />
  31.     </para>
  32.    </td>
  33.   </xsl:template>
  34.  
  35.   </xsl:stylesheet>


 
c'est équivalent à l'autre code...
 
ton code à toi ne marche pas, car une fois que tu es dans le noeud /table/col_info, tu ne peux pas récupérer la position du noeud col, à moins de le conserver en variable ou en paramètre :
 
ici, je suis dans le noeud col et je garde sa position dans le paramètre $pos

Code :
  1. <xsl:variable name="pos">
  2. <xsl:value-of select="position()" />
  3. </xsl:variable>


maintenant, je ne suis plus dans le noeud col puisque je considère /table/col_info, donc position() me renvoie ma position dans /table/col_info et à moi de la comparer avec celle que j'avais stocké dans $pos :

Code :
  1. <xsl:value-of select="/table/col_info[position()=$pos]/@align" />


 :D

Reply

Marsh Posté le 24-07-2002 à 09:37:27    

c'est bizarre que ton code :
 

Code :
  1. <xsl:value-of select="parent::node()/parent::node()/col_info[position() = position(self::node())]/@align"/>

 
 
ne te retourne pas d'erreur, la fonction position() ne doit pas posséder d'arguments

Reply

Marsh Posté le 24-07-2002 à 09:37:27   

Reply

Marsh Posté le 24-07-2002 à 11:23:22    

:heink: en effet, j'ai une erreur cette fois.
comment ai-je testé ça encore ? j'ai fait un simple copier-coller...  :heink:  
 
bah. c'est résolu. merci pour les ezplications :jap:


---------------
As the plane took off, the pilot turned to the co-pilot and said, “Have you ever flown solo?” Co-pilot: No. Typically I fly much higher than this.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed