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.
Vous devez vous connecter pour publier un commentaire.
child::node()
correspond à n'importe quel nœud qui n'est pas un attribut d'un nœud, nœud d'espace de noms, ou nœud de document. Cela signifie qu'il ne match les instructions de traitement, les commentaires et les nœuds de texte.child::*
correspond seulement éléments.Voir section 5.5.3 de la spec:
Mise à jour: Michael réponse inspiré de la feuille de style suivant. L'utiliser pour tester les types de nœuds qu'ils sont traités:
Modifier ce qui est jumelé/sélectionné pour tester d'autres modèles. Par exemple, l'entrée suivante:
Produit la sortie suivante:
Un merci spécial à cette page de m'avoir commencé sur le nœud de type tests. (Il est particulièrement approprié que celui de Michael réponses de plus de six ans semble y, aussi.)
De s'étendre sur les lwburk réponse, si votre XML ressemble à ceci:
Puis l'élément a 7 nœuds enfants; trois d'entre eux sont des éléments, quatre sont des nœuds de texte. L'expression
child::node()
correspond à tous les 7, tandis quechild::*
seules les correspondances avec les éléments.">"
et avant la prochaine"<"
il y a certains espaces. Il y a quatre de ces lacunes, et chacun est un espace de texte seulement nœud.