2012-01-20 4 views
1

Je suis nouveau dans XSLT et je ne sais pas comment je peux transformer ceci:Comment écrire un attribut ID à un autre noeud

<GCInitialStep id="id_A" name="INIT"/> 
    <GCTransition id="id_B" name="T1"/> 
    <GCStep id="id_C" name="A1"/> 
    <!-- ... --> 
    <GCLink fromObject="id_A" toObject="id_B"/> 
    <GCLink fromObject="id_B" toObject="id_C"/> 

Pour

<InitialStep id="id_A" name="INIT" 
       parentid="" 
       childid="id_B"/> 
    <Transition id="id_B" name="T1" 
       parentid="id_A" 
       childid="id_C"/> 
    <Action id="id_C" name="A1" 
     parentid="id_B" 
     childid=""/> 

Est-il possible? Comment?

Merci de

+0

Quel est l'algorithme? –

+0

Je viens d'éditer la question, en entrée, 'GCLink' lie les objets par leur ID et je veux consolider cela dans le noeud en spécifiant parent/enfant (le cas échéant). –

+0

Vous devez expliquer les exigences! Par exemple: Quelles sont les règles pour générer un élément 'Action'? S'il vous plaît, éditez la question et fournissez un document XML complet (ce que vous avez maintenant n'est pas un document bien formé), le résultat exact recherché et une bonne explication de toutes les exigences que la transformation doit implémenter. –

Répondre

2

Utilisez le quelque chose comme ceci:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="fromKey" match="GCLink" use="@fromObject"/> 
    <xsl:key name="toKey" match="GCLink" use="@toObject"/> 

    <xsl:template match="/root"> 
     <xsl:copy> 
      <xsl:apply-templates select="*[not(self::GCLink)]"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:element name="{substring(name(), 3)}"> 
      <xsl:copy-of select="@id"/> 
      <xsl:copy-of select="@name"/> 
      <xsl:attribute name="parentid"> 
       <xsl:value-of select="key('toKey', @id)/@fromObject"/> 
      </xsl:attribute> 
      <xsl:attribute name="childid"> 
       <xsl:value-of select="key('fromKey', @id)/@toObject"/> 
      </xsl:attribute> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

appliquée à

<root> 
    <GCInitialStep id="id_A" name="INIT"/> 
    <GCTransition id="id_B" name="T1"/> 
    <GCStep id="id_C" name="A1"/> 
    <GCLink fromObject="id_A" toObject="id_B"/> 
    <GCLink fromObject="id_B" toObject="id_C"/> 
</root> 

sorties

<root> 
    <InitialStep id="id_A" name="INIT" parentid="" childid="id_B" /> 
    <Transition id="id_B" name="T1" parentid="id_A" childid="id_C" /> 
    <Step id="id_C" name="A1" parentid="id_B" childid="" /> 
</root> 
+1

C'est exactement ce que je veux, merci beaucoup Kirill! –

+1

@Arnaud, de rien! –

Questions connexes