Comment utiliser en boucle dans xslt
Comment utiliser xsl:for-each
dans xslt pour obtenir la valeur de manière itérative à partir d'un fichier xml et d'affichage dans le tableau obtenues
Par exemple: le fichier xml est comme
<order>
<item name ="a"/>
<item name ="b"/>
<item name ="c"/>
<item name ="d"/>
<item name ="e"/>
<item name ="f"/>
<item name ="g"/>
</order>
et la sortie doit être
a b c d
e f g
la boucle doit compter le point et, si elle est divisble par 4, il
doit fermer la ligne actuelle et ajouter une nouvelle ligne et ainsi de suite..
je suis en utilisant la suite de xslt pour cette
mais je ne peux pas l'afficher sous forme de tableau
<xsl:template match="/">
<html>
<body>
<xsl:call-template name ="incr">
<xsl:with-param name ="value">1</xsl:with-param>
<xsl:with-param name ="limit">
<xsl:value-of select ="count(//item)"/>
</xsl:with-param>
</xsl:call-template>
</body>
</html>
</xsl:template >
<xsl:template name="incr">
<xsl:param name="value"/>
<xsl:param name ="limit"/>
<xsl:if test ="$value!=$limit+1">
<xsl:value-of select ="//item[$value]/@name"/>
<xsl:if test ="$value mod 4 =0">
<br/>
<br/>
</xsl:if>
<xsl:call-template name ="incr">
<xsl:with-param name ="value" select ="$value+1"/>
<xsl:with-param name ="limit" select ="$limit"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
s'il vous plaît aidez-moi à faire ce
Merci d'avance
Qu'avez-vous fait pour résoudre ce problème jusqu'à présent? Cela ressemble à des devoirs.
+1 pour la question. Voir ma réponse complète et correcte de la solution. 🙂
+1 pour la question. Voir ma réponse complète et correcte de la solution. 🙂
OriginalL'auteur Thorin Oakenshield | 2010-05-10
Vous devez vous connecter pour publier un commentaire.
La manière de penser les problèmes de toute la complexité dans XSLT n'est pas "comment pourrais-je écrire un programme pour produire des Y, X donné que l'entrée?" mais plutôt, "compte tenu de la sortie Y, que X je vais transformer pour le produire?" Ce n'est pas un principe facile à saisir (ou expliquer), mais une fois que vous l'obtenez, ce qui semble comme des problèmes difficiles dans XSLT devenir trivial.
Si la sortie est une série de
tr
éléments, comme ceci:il y a, en substance, quatre éléments de sortie. Donc il doit y avoir quatre éléments d'entrée.
La première question est, les quatre? Assez clairement, ça va être le 1er, 4ème, 7ème et 10ème - c'est tous les 3 éléments, en commençant par le premier. Donc, votre point de départ est la transformation de ces quatre éléments:
Bon, et maintenant que nous avons sélectionné chaque troisième élément, comment allons-nous créer un
tr
et les éléments à droite après il? À l'aide de lafollowing-sibling
axe:Que du bon, comme il va. Mais il y a une bonne quantité de code dupliqué, et beaucoup de choses que vous avez à modifier si vous le souhaitez (dire) pour changer le nombre de colonnes de 3 à 6. Vous pouvez éliminer les duplications de code en faisant un autre modèle:
Et vous pouvez paramétrer le nombre de colonnes et de le mettre dans une variable, comme Dimitre l'a fait dans son exemple.
OriginalL'auteur Robert Rossney
Cette transformation:
lorsqu'il est appliqué sur le document XML fourni, produit souhaité résultats corrects:
Oui, et le même problème existe pour
$vNumCols
mis à 0. C'est parce que ces valeurs sont hors de portée, par définition, pour ce problème. Vous pouvez trouver que toute solution comment l'eau interstitielle en N tasses ne fonctionne pas si la température est de -1 degré Celsius.Merci pour vos commentaires.
Vous êtes les bienvenus.
OriginalL'auteur Dimitre Novatchev
Je ne suis pas sûr à 100% mais le code ci-dessous devrait le faire:
Vous avez tout à fait raison à propos de la "<tr>" problème. CDATA truc résout facilement. Vous pouvez consulter mon édité code ci-dessus. J'ai testé avec XML Notepad et il les transforme avec succès.
Ce n'est absolument pas le bon moyen de le faire.
mais sa de donner les bonnes la sortie.
OriginalL'auteur Cagdas
Pas de. De cette façon, la folie réside. Une ouverture et la balise de fermeture déclare une seule chose. La solution ci-dessus est un bodge.
OriginalL'auteur Thorin Oakenshield