2010-09-02 35 views
1

J'essaie d'insérer des ID uniques et des références à ces ID à l'aide d'un seul fichier XSLT.Référencement d'éléments insérés en un seul passage

Étant donné le XML:

<Parent> 
    <Name>Dr Evil</Name> 
    <Child> 
    <Name>Scott Evil</Name> 
    </Child> 
</Parent> 

Et ce bout XSLT après une identité transform:

<xsl:template match="Parent"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:element name="UID"><xsl:value-of select="generate-id(.)"/></xsl:element> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Child"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:element name="UID"><xsl:value-of select="generate-id(.)"/></xsl:element> 
    <xsl:element name="ParentUID"><xsl:value-of select="../UID"/></xsl:element> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

Je reçois la sortie:

<Parent> 
    <UID>XYZ123</UID> 
    <Name>Dr Evil</Name> 
    <Child> 
    <UID>ABC789</UID> 
    <ParentUID/>    <-- expected <ParentUID>XYZ123</ParentUID> 
    <Name>Scott Evil</Name> 
    </Child> 
</Parent> 

En d'autres termes, l'élément UID L'insertion dans le parent n'est pas visible lorsque l'élément ParentUID est inséré dans l'enfant. Je sais que je pourrais utiliser deux passes (deux transformations), mais je tiens vraiment à essayer de le faire dans un seul fichier.

+0

en plus bonne réponse de devnull, je vois que vous essayez de sélectionner des noeuds de l'arbre résultat. Rappelez-vous, cela ne va pas arriver. –

Répondre

2

Essayez de changer votre élément parentUID à:

<xsl:element name="ParentUID"> 
    <xsl:value-of select="generate-id(parent::Parent)"/> 
    </xsl:element> 

Vous pouvez également supprimer le xsl:element:

<ParentUID><xsl:value-of select="generate-id(parent::Parent)"/></ParentUID> 
+0

A travaillé parfaitement! Je vois maintenant comment generate-id résout toujours le même identifiant pour un élément donné. Je vous remercie. – Mykro

+0

Bonne réponse (+1) –

+0

De rien DJC. Merci Dimitre! –