Ce n' “@*|node()” dans un XSLT appliquer-modèle sélectionnez veux dire?
J'ai lu quelques XSLT exemples et trouvé ce code:
<xsl:apply-template select="@*|node()"/>
Ça veut dire quoi?
Vous devez vous connecter pour publier un commentaire.
J'ai lu quelques XSLT exemples et trouvé ce code:
<xsl:apply-template select="@*|node()"/>
Ça veut dire quoi?
Vous devez vous connecter pour publier un commentaire.
L'expression XPath
@* | node()
sélectionne le union de nœuds de l'attribut (@*
) et tous les autres types de nœuds XML (node()
).C'est un raccourci pour
attribute::* | child::node()
.En XSLT, XPath est par rapport à la nœud de contexte et la valeur par défaut sélection axe est le
child
de l'axe, donc l'expressionselect="..."
expression, par exemple dans<xsl:apply-templates>
)match=""
expression dans<xsl:template>
) - à noter qu'il existe une différence entre la sélection de nœuds et de les assortir: le nœud de contexte que les points de sélection.Imaginer le nœud suivant est le nœud de contexte:
l'expression
node()
permettra non seulement de sélectionner les deux<child>
nœuds, mais aussi quatre espaces-seulement les nœuds de texte (signifié par[
et]
un souci de visibilité) et le commentaire. Le<descendant>
n'est pas sélectionnée.Une caractéristique spéciale de XML est que les nœuds de l'attribut sont pas enfants des éléments qu'ils appartiennent à (bien que le parent d'un attribut de l'élément auquel elle appartient).
Cette relation asymétrique il est nécessaire de sélectionner séparément, d'où le
@*
.Il correspond à n'importe quel nœud d'attribut appartenant au nœud de contexte, de sorte que le
attr="value"
sera sélectionnée.La
|
est le chemin XPath de l'union de l'opérateur. Il crée un seul nœud défini à partir de deux node-sets.<xsl:apply-templates>
trouve alors approprié<xsl:template>
pour chaque nœud sélectionné et l'exécute pour le nœud. C'est le modèle correspondant à la partie que j'ai mentionné ci-dessus.node()
diffère de la simple*
en ce que, comme vous le dites, l'ancien sélectionne le texte, les commentaires et les espaces nœuds. Cela peut avoir des conséquences lors de l'utilisation deposition()
. En savoir plus sur ce ici.À ajouter à Tomalak excellente réponse:
Plus ofthen, on pouvait voir
<xsl:apply-template select="@*|node()"/>
utilisés dans un modèle comme celui-ci:Ceci est connu comme la identité de la règle ou "modèle d'identité de".
L'un des plus fondamentaux et puissant XSLT modèles de conception de l'utilisation et de l'primordial de l'identité de la règle.
Si une transformation est constitué seulement de l'identité de la règle, le résultat de la transformation est le document XML source elle-même-c'est pourquoi le modèle est connu comme "l'identité de la règle".
Pourquoi est-ce le résultat produit?
La réponse courte est: en raison de la transformation XSLT de transformation de modèle.
Une explication plus détaillée doit commencer par le haut:
correspond à tout élément de nœud texte, un commentaire ou une instruction de traitement. Le document- (racine)-nœud de correspondance par
node()
.On peut imaginer que la "feuille de route" des nœuds d'un document de l'arbre -- ce sont les nœuds qui n'ont pas d'enfants eux-mêmes comme un nœud texte, commentaire et de l'instruction de traitement. Un élément vide devrait également être considéré comme un nœud feuille.
L'identité de la règle est initialement sélectionné pour l'exécution (appliquée) à l'encontre de tous les noeuds enfants du document nœuds (ce sont les seul top éléments et les commentaires, ou instruction de traitement des frères et sœurs, il pourrait avoir). La correspondance nœud est peu profonde copié et si c'est un élément de nœud feuille, la
<xsl:apply-templates select="node()|@*"/>
instruction ne sélectionnez pas de nœuds ou d'attributs.Si la correspondance nœud est un élément, c'est peu profonde copié puis le
<xsl:apply-templates select="node()|@*"/>
instruction provoque le même modèle (comme il n'y a pas d'autre modèle dans la transformation de code) pour être appliquée à l'encontre de chacun de ses attributs et de chacun de ses nœuds enfants.C'est la récursivité que les lecteurs de traitement de chaque nœud du document XML jusqu'à ce que les nœuds feuilles ou les attributs sont atteints et à quel endroit le
<xsl:apply-templates select="node()|@*"/>
choisit pas d'enfants ou attribut.Félicitations à @Tomalak pour la première bonne réponse. La tique doit être sur sa réponse. Je vais juste ajouter quelques précisions à sa réponse.
Note Un
De l'opérateur | pas seulement des retours à l'union des deux opérandes mais trie dans l'ordre du document et supprime les doublons. La de-dup partie n'est pas pertinente ici, car il n'y a pas de doublons à supprimer, mais le tri partie vaut la peine de noter. Plus version correcte serait de dire ...
Remarque Deux
C'est globalement vrai, mais elle est trompeuse. Quand la plupart des gens lire "XML nœuds enfants", ils pensent que les nœuds enfants dans les DOM sens. Mais ce n'est pas ce qui est sélectionné. Seulement XDM nœuds sont sélectionnés. Pour une illustration de prendre un coup d'oeil à la suite de ce document.
Maintenant, supposons que l'élément de contexte est la "racine-élément". Un lecteur de Tomalak la réponse est posé la question: quel est sélectionné par "@*|node()"? L'implication de Tomalak la réponse pour ceux qui envisagent de le modèle DOM, serait qu'il y a 6 choses sélectionné:
Mais ce n'est pas vrai dans XSLT. Ce qui est effectivement sélectionné est ...
De manière plus précise serait ...
L'expression XPath @* | node() sélectionne l'union, triés dans l'ordre du document, de (nœuds de l'attribut de l'élément de contexte et XML nœuds enfants de l'élément de contexte dans le sens de la XDM). Le XD modèle ignore certains types de nœuds, tels que les définitions d'entités, qui sont dans les DOM, et contiguë texte nœuds DOM sont concaténées dans une XDM nœud de texte.
@* | node()
sélectionne l'union, triés dans l'ordre du document, de: nœuds de l'attribut de l'élément de contexte et XML nœuds enfants de l'élément de contexte, dans le sens de la XDM."