XSLT ligne counter - est-il difficile?
J'ai triché à chaque fois que j'ai eu besoin de faire un nombre de lignes dans XSLT à l'aide de JScript, mais dans ce cas je ne peux pas faire. Je veux simplement écrire une ligne de comptoir toute un fichier de sortie. Cet exemple de base a une solution simple:
<xsl:for-each select="Records/Record">
<xsl:value-of select="position()"/>
</xsl:for-each>
Sortie:
1
2
3
4
etc...
Mais que faire si la structure est plus complexe avec foreach imbriquée est :
<xsl:for-each select="Records/Record">
<xsl:value-of select="position()"/>
<xsl:for-each select="Records/Record">
<xsl:value-of select="position()"/>
</xsl:for-each>
</xsl:for-each>
Ici, à l'intérieur foreach serait juste de réinitialiser le compteur (de sorte que vous obtenez 1, 1, 2, 3, 2, 1, 2, 3, 1, 2 etc.). Personne ne sait comment je peux la sortie de la position dans le fichier (c'est à dire. un nombre de lignes)?
- Excellente Question (+1). Voir ma réponse pour une solution qui produit de la ligne de numéros pour le texte.
Vous devez vous connecter pour publier un commentaire.
Une ligne dans un fichier XML n'est pas vraiment la même chose qu'un élément. Dans ton premier exemple, on ne compte pas les lignes -, mais le nombre d'éléments.
Un fichier XML pourrait ressembler à ceci:
Ou exactement le même fichier XML peut ressembler à ceci:
qui le XSLT interpet exactement la même chose - il ne sera pas vraiment pris la peine avec les sauts de ligne.
Par conséquent, il est difficile d'afficher les numéros de ligne dans la façon dont vous le souhaitez à l'aide de XSLT c'est pas fait pour ce genre d'analyse.
Quelqu'un me corrige si je me trompe, mais je dirais que vous auriez besoin de Javascript ou de quelque autre langage de script pour faire ce que vous voulez.
Alors qu'il est tout à fait impossible de marquer les numéros de ligne pour la sérialisation d'un document XML (parce que cette sérialisation en soi est ambigu), il est parfaitement possible, et
easy
, à nombre de lignes de texte de taille ordinaire.Cette transformation:
lorsqu'il est appliqué sur ce document XML:
produit de la ligne souhaitée, de la numérotation:
Merci pour les réponses les gars - ouais, vous êtes tout à fait correcte, certains de fonction externe est la seule façon d'obtenir ce comportement en XSLT. Pour ceux à la recherche, c'est la façon dont je l'ai fait lors de l'utilisation d'un compilé de transformer en .Net 3.5:
Créer une classe d'assistance pour votre fonction(s)
Ajouter une instance à une args liste pour XSLT
L'utiliser en vous XSLT
Mis cela dans la feuille de style de la déclaration de l'élément:
Ensuite utiliser comme:
Généralement,
position()
est fait référence au numéro du nœud actuel par rapport à l'ensemble du lot de nœuds qui est en cours de traitement actuellement.Avec votre "imbriqués for-each", par exemple, la numérotation consécutive peut facilement être accompli lorsque vous arrêtez de nidification pour chaque construit et il suffit de sélectionner tous les éléments à la fois.
Avec ce XML:
une boucle de construction comme ce
entraînera
mais vous pouvez tout simplement faire ceci à la place:
et vous obtenez