Question

Je ne sais pas si je fais vraiment une erreur ou si cela est tout simplement ne fonctionne pas correctement:

<xsl:if test="position() = 1 or parent::position() = 1">
   <!-- do something -->
</xsl:if>

Si le noeud courant est le premier enfant, ou parent de l'enfant est le premier, puis faire quelque chose de spécial.

Le problème est "parent :: la position () = 1" .. avec XmlCompiledTransform de .net je reçois

Fin prévue de l'expression, trouvé '(' ... sition () = :: position 1 ou d'un parent -.> (<-. = 1

Maintenant, semble-t-il ne fonctionne pas comme ça de position () dans la deuxième partie, mais .. comment puis-je obtenir la position du parent? Comment puis-je, en général, combiner Fonctions XPath avec XPath dans les tests?

Était-ce utile?

La solution

Bonne question, +1.

Vous devez définir ce qu'on entend par Position du parent .

parent::node()[position() = 1] 

est toujours true() lorsque le nœud parent existe (est false() que si le noeud contextuel est le noeud du document / que ce nœud est le nœud de haut dans l'arbre et ne dispose pas d'un parent), parce que tout noeud dans un arbre (document XML bien formé), par définition, peut avoir au plus un nœud parent.

La plupart, vous voulez susceptible de tester que l'élément parent est le premier dans l'ordre du document parmi ses frères et sœurs . Une façon de tester pour cela est:

not(parent::node()/preceding-sibling::*)

Ainsi, le code complet devient :

<xsl:if test="position() = 1 or not(parent::node()/preceding-sibling::*)">        
   <!-- do something -->        
</xsl:if>        
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top