Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1112 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°188232
THE REAL R​OTOUTOU
The REAL Lord of Pain
Posté le 01-08-2002 à 20:00:09  profilanswer
 

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 ...
mood
Publicité
Posté le 01-08-2002 à 20:00:09  profilanswer
 

n°188550
THE REAL R​OTOUTOU
The REAL Lord of Pain
Posté le 02-08-2002 à 10:34:28  profilanswer
 

un petit up pour les gens du matin :)


---------------
[:the%20real%20rotoutou] the universe's worst nightmares come to life ...
n°188562
therier
heu...coucou!
Posté le 02-08-2002 à 10:48:36  profilanswer
 


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

n°188654
THE REAL R​OTOUTOU
The REAL Lord of Pain
Posté le 02-08-2002 à 11:59:40  profilanswer
 

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 ...
n°189131
THE REAL R​OTOUTOU
The REAL Lord of Pain
Posté le 02-08-2002 à 22:47:45  profilanswer
 

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 ...
n°189371
THE REAL R​OTOUTOU
The REAL Lord of Pain
Posté le 03-08-2002 à 19:23:52  profilanswer
 

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 ...

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
comment faire un IF ( ){ } avec plusieurs conditions?[XML] netscape
Pb PHP avec XML[ XML RPC PHP] eske kelkun sait commment .... ?
voir le XML question toute conne, pour visualiser ss passer par saxon[PERL] Parser XML et caractères non utf8
[ACCESS] creer plusieurs utilisateurs pour une base de donnees Access?[ XML ] les saut de lignes ?
[XML] possibilité? 
Plus de sujets relatifs à : [XML-XSLT] réunir plusieurs arborescences en une seule non redondante


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR