[XML-XSLT] réunir plusieurs arborescences en une seule non redondante

réunir plusieurs arborescences en une seule non redondante [XML-XSLT] - Programmation

Marsh Posté le 01-08-2002 à 20:00:09    

salut :)
 
j'ai un fichier XML contenant plusieurs noeuds representant une arborescence, et je dois le modifier (avec une feuille XSL) pour obtenir un nouveau fichier XML ayant une representation unifiée et non redondante de l'arborescence
 
et bien sur j'y arrive pas, j'ai la tete qui fume :p
 
le fichier de départ :
 

Citation :


<?xml version="1.0" encoding="ISO-8859-1"?>
<a>
  <subscribers>
    <subscriber>
      <id id="1" />  
        <path>
          <node type="T1" name="N1">
            <node type="T2" name="N2">
              <node type="T3" name="N3" />
            </node>
          </node>
        </path>    
      </subscriber>
    <subscriber>
      <id id="2" />
      <path>
        <node type="T1" name="N1">
          <node type="T2" name="N2">
            <node type="T3" name="N4" />
          </node>
        </node>
      </path>
    </subscriber>
  </subscribers>
</a>


 
et le fichier que j'aimerais avoir comme résultat :
 

Citation :


<?xml version="1.0" encoding="ISO-8859-1"?>
<a>
  <node type="T1" name="N1">
    <node type="T2" name="N2">
      <node type="T3" name="N3" id="1">
      <node type="T3" name="N4" id="2">    
    </node>
  </node>
</a>


 
j'ai en gros l'algo en tete, pour chaque noeud "node" d'un niveau, il faut verifier que ce noeud n'est pas deja present dans les autres arborescences, puis appeller la template qui ecrit les sous niveaux à partir de ce noeud si ce noeud existe deja (identifié par type et name), sinon le créer ...
 
y a un champion du XSL sur le forum ? :)
 
a+


Message édité par THE REAL ROTOUTOU le 03-08-2002 à 19:24:32

---------------
[:the%20real%20rotoutou] the universe's worst nightmares come to life ...
Reply

Marsh Posté le 01-08-2002 à 20:00:09   

Reply

Marsh Posté le 02-08-2002 à 10:34:28    

un petit up pour les gens du matin :)


---------------
[:the%20real%20rotoutou] the universe's worst nightmares come to life ...
Reply

Marsh Posté le 02-08-2002 à 10:48:36    


Ce que tu veux faire, c chaud pasque XSL fonctionne soit en pattern matching, soit en sequentiel, mais quand tu mixes les 2....
 
 

Reply

Marsh Posté le 02-08-2002 à 11:59:40    

therier a écrit a écrit :

 
Ce que tu veux faire, c chaud pasque XSL fonctionne soit en pattern matching, soit en sequentiel, mais quand tu mixes les 2....




 
bin en fait j'ai deja pas mal de XML/XSLT dans les pattes (j'etais dessus depuis le debut), mais là je cale ...
 
faire les tests pour reperer si un path existe deja (je suis sur le noeud de profondeur 3, est ce que mon chemin a deja été traité et ecrit dans l'output ?) c'est chaud, mais si c'est le cas et qu'il faut recoller la propagation des sous noeuds par rapport à cette arborescence deja existante ... euh ... :o
 
quelle misere ...


---------------
[:the%20real%20rotoutou] the universe's worst nightmares come to life ...
Reply

Marsh Posté le 02-08-2002 à 22:47:45    

coin coin ! :)
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
 
<xsl:key name="parent" match="node" use="concat(parent::node/@type,'::',parent::node/@name)"/>
<xsl:key name="me" match="node" use="concat(@type,'::',@name)"/>
 
<xsl:template match="a">
<a>
  <xsl:apply-templates select="subscribers/subscriber/path/node"/>
</a>
</xsl:template>
 
<xsl:template match="node">
  <xsl:variable name="mykey" select="concat(@type,'::',@name)"/>
  <xsl:choose>
    <xsl:when test="generate-id(.) = generate-id(key('me',$mykey)[1])">
      <xsl:element name="{name()}">
        <xsl:copy-of select="@*"/>
        <xsl:if test="not(node)">
          <xsl:attribute name="id">
            <xsl:value-of select="ancestor::subscriber/id/@id"/>
          </xsl:attribute>
        </xsl:if>
        <xsl:apply-templates select="key('parent',concat(@type,'::',@name))"/>
      </xsl:element>
    </xsl:when>
  </xsl:choose>
</xsl:template>
 
</xsl:stylesheet>
 
a+


---------------
[:the%20real%20rotoutou] the universe's worst nightmares come to life ...
Reply

Marsh Posté le 03-08-2002 à 19:23:52    

oups ...
 
pour que la feuille XSL de mon precedent post marche, il faut que les arbres de <node> soient triés du plus petit au plus grand (en profondeur), sinon on perd des attributs id qui ne sont pas écrits
 
il suffit de passer cette feuille sur le fichier d'origine pour trier le bordel :)
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
 
<xsl:template match="a">
<a>
  <subscribers>
    <xsl:for-each select="subscribers/subscriber">
      <xsl:sort select="count(.//node)" order="ascending" data-type="number" />
      <xsl:copy-of select="."/>
    </xsl:for-each>
  </subscribers>
</a>
</xsl:template>
 
</xsl:stylesheet>
 
see u


---------------
[:the%20real%20rotoutou] the universe's worst nightmares come to life ...
Reply

Sujets relatifs:

Leave a Replay

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