Différence entre: child::node() et child::*

J'ai juste écrit une transformation XSLT qui ne fonctionne pas au premier abord.

J'ai dû renommer tous les enfants de <Recordset> à <C>:

<?xml version="1.0" encoding="utf-8"?>
<Record>
<Recordset>
    <company>102</company>
    <store>1801</store>
    ....
</Recordset>
<Recordset>
....
</Recordset>
</Record>

J'ai utilisé la transformation XSLT suivante:

<xsl:template match="Record/Recordset/child::*">    
    <xsl:element name="C">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

Il fonctionne et renomme tous les enfants de <Recordset> à <C>.
Mais mon premier match dans le modèle ressemblait à ceci:

<xsl:template match="Record/Recordset/child::node()">

Mon idée était que chaque enfant de <Recordset> est un nœud, ainsi node() serait approprié.
Il en fait trop mais c'est insérée une extra <C/> pour chaque enfant.

Quelle est la différence entre child::node() et child::*?

  • "Mon idée était que chaque enfant de <Recordset> est un nœud" >> cette déclaration est correcte, mais vous avez oublié le nœud de texte des enfants, même s'ils sont les seuls dans votre exemple. D'autres enfants qui ne sont pas des éléments sont aussi des nœuds: les commentaires et instructions de traitement. Noms des nœuds et des nœuds de l'attribut sont traités spécialement.
  • Merci Abel pour votre commentaire. J'ai pensé à elle en attendant.
InformationsquelleAutor Peter | 2011-03-22