Recursivité et XSLT

Recursivité et XSLT - XML/XSL - Programmation

Marsh Posté le 16-04-2009 à 12:14:27    

Bonjour, j'ai un petit soucis pour creer une feuille de style à partir d'un fichier xml récursif. Je m'explique, j'ai une arborescence XML qui ressemble à ça :  
 
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl' href='AttributesIMF.xslt'?>
<Declarations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="AttributesIMF.xsd">
    <Attributes>
        <Attribute>
            <Name>A</Name>
            <Attribute>
                <Name>B</Name>
                <Attribute>
                    <Name>C</Name>
                </Attribute>
                <Attribute>
                    <Name>D<Name>
                </Attribute>
            </Attribute>
         </Attribute>  
      <Attributes>
 
, c'est à dire qu'un noeud peut avoir un certains nombre de fils de meme type que lui qui peuvent eux-mêmes avoir un certains nombre de fils de meme type que lui etc...(un arbre quoi...)
et j'ai un problème lorsque je veux afficher mon fichier XML, j'ai mon fichier XSLT qui ressemble à ça :  
 
 <xsl:template match="Attributes">
    <html>
      <body>
        <h1>Application-Specific Attributes</h1>
        <xsl:apply-templates select="Attribute[not(@xsi:type)]">
          <xsl:sort select="."/>
        </xsl:apply-templates>
      </body>
    </html>
  </xsl:template>
 
Lorsque que j ouvre mon fichier XML avec un navigateur, seul mon Attribute A est affiché et pas les autres...
J'ai essayé avec la balise <xsl:for-each select> mais dans ce cas la ça ne me prend que les fils direct de A, mais ni A ni les fils des fils de A...
Je sais pas si tout ça est tres clair mais si qq'un à une solution je suis preneur...
Merci
 

Reply

Marsh Posté le 16-04-2009 à 12:14:27   

Reply

Marsh Posté le 16-04-2009 à 12:17:30    

Ca me semble normal, là tu sélectionnes juste Attributes/Attribute[not(@xsi:type)]. Si ta xsl:template[match='Attribute'] n'est pas récursive ça risque pas de récurser [:spamafote]

 

Mais comme t'as pas donné le contenu de la dite xsl:template[match='Attribute']...


Message édité par masklinn le 16-04-2009 à 12:19:55

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-04-2009 à 12:24:23    

merci pour la réponse rapide...
Voila le contenu de ce qu'il manque je pense...
 
 <xsl:template match="Attribute">
    <h2>
      <a>
        <xsl:attribute name="name">
          <xsl:value-of select="Name"/>
        </xsl:attribute>
        <xsl:value-of select="Name"/> - (<xsl:value-of select="Type"/> ) </a>
    </h2>
    <p>
      <xsl:value-of select="Description"/>
    </p>
  </xsl:template>

Reply

Marsh Posté le 16-04-2009 à 12:29:33    

Bon ben voilà, t'as ta réponse, à aucun moment tu ne sélectionnes le reste de tes attributs [:spamafote]

 

Donc il faut soit rendre ta template Attribute récursive:

Code :
  1. <xsl:template match="Attribute">
  2.    <h2>
  3.      <a>
  4.        <xsl:attribute name="name">
  5.          <xsl:value-of select="Name"/>
  6.        </xsl:attribute>
  7.        <xsl:value-of select="Name"/> - (<xsl:value-of select="Type"/> )
  8.      </a>
  9.    </h2>
  10.    <p>
  11.      <xsl:value-of select="Description"/>
  12.    </p>
  13.    <xsl:apply-templates select="Attribute"/>
  14. </xsl:template>


Soit effectuer une sélection initiale sur l'axe descendant et non child


Message édité par masklinn le 16-04-2009 à 12:30:08

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-04-2009 à 12:38:49    


Ok, c'est cool ça marche...
merci beaucoup pour ton aide rapide et efficace!!
@++ et encore merci.

Reply

Marsh Posté le 27-04-2009 à 17:11:38    

Bonjour,
J'ai un peu le même type de pb mais, en plus, je voudrais incrémenter le "h"... Je m'explique :
je souhaite transformer le code xml suivant :
 
<node titre="chapitre 1">
<note>contenu1</note>
<node titre="sous-chapitre 1">
<note>blabla1</note>
</node>
<node titre="sous-chapitre 2">
<node titre="sous-chapitre 2.1">
<note>blabla2</note>
</node>
<node titre="sous-chapitre 2.2">
<note>blabla3</note>
</node>
</node>
</node>
<node titre="chapitre 2">
...
</node>
 
en :
 
<h1>1- Chapitre 1</h1>
<p>Contenu 1</p>
<h2>1.1- sous-chapitre 1</h2>
<p>blabla1</p>
<h2>1.2- sous-chapitre2</h2>
<h3>1.2.1- sous-chapitre 2.1</h3>
<p>blabla2</p>
<h3>1.2.2-sous-chapitre 2.2</h3>
<h1>2-Chapitre2</h1>
 
Mon pb est que les nodes peuvent avoir x niveaux de childs qui s'appellent tous "node" (je ne souhaite pas descendre en dessous de h4 et donc transformer les niveaux >4 en "p"...)
 
Je débute en xsl "sur le tas" et je me perds complètement dans les notions de variables et de params
Merci de votre aide

Reply

Marsh Posté le 27-04-2009 à 17:14:46    

Et donc?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-04-2009 à 08:40:42    

Donc, je ne trouve pas comment attribuer une balise <hx> en fonction du niveau du <node> où je me trouve, ni comment calculer le numéro de sous-chapitre...
En fait, je pars d'une carte Freemind qui me sert à rédiger divers documents (compte-rendus, rapports et autres joyeusetés...) et je voudrais transformer ce fichier xml en fichier html (ça freemind le fait très bien mais avec des <li> et donc quel que soit la profondeur) qui contienne ces titres. Par ailleurs, j'ai un javascript qui génère une TOC à partir des balises <hx> du document. Je voudrais intégrer ce script pour les documents générés afin d'en faciliter la navigation.  
Ca paraît simple comme ça, mais quand on découvre XSLT ça l'est un peu moins...

Reply

Marsh Posté le 28-04-2009 à 09:21:02    

Paramètre pour déterminer la profondeur actuelle ou un comptage des nodes sur l'axe ascendants:: pour savoir à quelle profondeur tu est sans avoir à passer de paramètre.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-04-2009 à 15:26:43    

:ouch: Wow ! Ca calme ! Je suis un humble débutant... pourrais-tu être plus explicite ? un petit exemple peut-être ? ou un lien vers un tuto qui me permette de comprendre... (je ne veux pas te faire perdre ton temps)

Reply

Marsh Posté le 28-04-2009 à 15:26:43   

Reply

Marsh Posté le 28-04-2009 à 15:30:21    

http://www.zvon.org/xxl/XSL-Ref/Tu [...] on/r1.html
http://www.zvon.org/xxl/XSL-Ref/Tu [...] s/ax2.html
 
(btw c'était "ancestor" pas "ascendant" l'axe, désolé pour l'erreur)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-04-2009 à 16:02:37    

Je pense qu'il faut aussi regarder du côté de l'element xsl:number, très intéressant pour insérer un numérotage dans le résultat...

Reply

Marsh Posté le 28-04-2009 à 16:04:43    

Preuve de mon ignorance dans le domaine je ne l'avais pas vue :D  
Merci bcp, je vais voir avec zvon si je m'en sors

Reply

Sujets relatifs:

Leave a Replay

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