compréhension de la fonction position() dans XSLT
J'ai un problème similaire, comme ce mec:
à l'aide de fonction position() dans xslt
Mais je n'ai pas besoin de la numérotation, je veux juste comprendre la façon dont il fonctionne:
<?xml version="1.0" encoding="UTF-8"?>
<test>
<a>blah</a>
<a>blah</a>
<a>blah</a>
<a>blah</a>
</test>
pour cette entrée, la feuille de style suivant:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="select">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="a">
<xsl:value-of select="position()"/><br/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
sorties:
<html><body>
2<br>blah
4<br>blah
6<br>blah
8<br>blah
</body></html>
Pourquoi faut-il ignorer les impairs?
double possible de utilisation de la fonction position() dans xslt
Quel est le but de
Quel est le but de
<xsl:template match="select">
dans votre feuille de style? Votre entrée n'est pas un élément nommé select
.OriginalL'auteur user3629892 | 2015-02-25
Vous devez vous connecter pour publier un commentaire.
Parce que pendant que vous étiez à la
/
niveau, vous avez dit:qui applique des modèles pour tous les nœuds enfants du nœud racine, et (en raison de l'intégré dans le modèle de règles) à l'ensemble de leurs descendants - y compris les nœuds de texte qui séparent les
<a>
éléments.Vous obtiendrez un résultat différent avec une entrée de:
ou si vous ajoutez une instruction à votre feuille de style:
ou si vous appliquer des modèles de manière sélective, par exemple
a
éléments ne sont pas des enfants du nœud racine/
, ils sont les petits-enfants.Vous avez raison. Mon point est que les nœuds de texte en les séparant sont frères et sœurs.
Vrai, mais quand tu dis que c'est la faute de la
<xsl:apply-templates/>
dans le/
modèle, c'est faux. Même si vous avez changé ça pour dire<xsl:apply-templates select="test"/>
il ne change pas le nombre de sortie comme ils découlent de l'utilisation de la règle par défaut sur letest
élément.Je suppose que la rendant
select="test/a"
serait un travail même si.Le point ici est que les modèles sont appliqués indifféremment dans le contexte de
a
parent. la faute de la <xsl:apply-templates/> dans le/
modèle, quoique indirectement. De toute façon j'ai édité ma réponse dans un effort pour rendre cela plus clair. Je crois qu'en conjonction avec votre réponse le tableau complet est présenté ici.OriginalL'auteur michael.hor257k
La
position()
fonction vous donne la position du nœud courant dans le "courant de la liste des nœuds", qui est ce qui a étéselect
-ed par le plus procheapply-templates
oufor-each
(XSLT 2.0 se réfère à des "objets" et des "séquences" plutôt que de noeuds et le noeud listes, mais le principe est le même).Dans votre exemple, la racine modèle s'applique modèles à deux de ses nœuds enfants (le nœud de texte contenant le saut de ligne après la déclaration xml, et le
test
élément). Il n'y a pas de règle explicite correspondanttest
donc la règle par défaut s'applique, pour les éléments<xsl:apply-templates/>
.Ainsi, lorsque le
a
modèle de feux de son "nœud actuel de la liste" est l'ensemble de tous les 9 nœuds enfants detest
. Cette liste est constituée d'une alternance de nœuds de texte (les sauts de ligne) et les nœuds d'élément (lea
éléments), avec les nœuds de texte à la position impaire et les nœuds d'élément à la même position.Si vous avez ajouté un modèle explicite pour
test
comme ceci:Alors ce serait sélectionnez seulement le 4
a
nœuds d'élément comme le nœud de la liste, de sorteposition()
serait de vous donner 1, 2, 3 et 4.OriginalL'auteur Ian Roberts