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

 


Dernière réponse
Sujet : [XML-XSLT] réunir plusieurs arborescences en une seule non redondante
THE REAL ROTOUTOU 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

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
THE REAL ROTOUTOU 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 REAL ROTOUTOU 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 REAL ROTOUTOU

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

therier
Ce que tu veux faire, c chaud pasque XSL fonctionne soit en pattern matching, soit en sequentiel, mais quand tu mixes les 2....
 
 
THE REAL ROTOUTOU un petit up pour les gens du matin :)
THE REAL ROTOUTOU 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+


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)