XSLT - boucle, le nombre, la position() avec des variables
Excuses à l'avance pour un total novice ici et en difficulté après la lecture de presque tous les XSLT thread ici. Donc, j'ai désespérément besoin de plusieurs cachets d'aspirine et de vos conseils!!
J'ai trois paramètres entrants/les variables qui doivent être traitées à l'aide de xslt version 1.0.
<!-- Variables in the XSL -->
<xsl:variable name="tw">125</xsl:variable>
<xsl:variable name="rows">4</xsl:variable>
<xsl:variable name="cols">6</xsl:variable>
Je veux finir avec la valeurs calculées (en pixels) dans lede fond-positions " du HTML comme ci-dessous:-
<div style="background-position:-0px -0px;"><img src="images/thumbs/1.jpg" alt="one" /></div>
<div style="background-position:-125px -0px;"><img src="images/thumbs/2.jpg" alt="two" /></div>
<div style="background-position:-250px -0px;"><img src="images/thumbs/3.jpg" alt="three" /></div>
<div style="background-position:-375px -0px;"><img src="images/thumbs/4.jpg" alt="four" /></div>
<div style="background-position:-500px -0px;"><img src="images/thumbs/5.jpg" alt="five" /></div>
<div style="background-position:-625px -0px;"><img src="images/thumbs/6.jpg" alt="six" /></div>
<div style="background-position:-0px -125px;"><img src="images/thumbs/7.jpg" alt="seven" /></div>
<div style="background-position:-125px -125px;"><img src="images/thumbs/8.jpg" alt="eight" /></div>
<div style="background-position:-250px -125px;"><img src="images/thumbs/9.jpg" alt="nine" /></div>
<div style="background-position:-375px -125px;"><img src="images/thumbs/10.jpg" alt="ten" /></div>
<div style="background-position:-500px -125px;"><img src="images/thumbs/11.jpg" alt="11" /></div>
<div style="background-position:-625px -125px;"><img src="MIB/images/thumbs/12.jpg" alt="12" /></div>
<div style="background-position:-0px -250px;"><img src="images/thumbs/13.jpg" alt="13" /></div>
<div style="background-position:-125px -250px;"><img src="/mages/thumbs/14.jpg" alt="14" /></div>
<div style="background-position:-250px -250px;"><img src="images/thumbs/15.jpg" alt="15" /></div>
<div style="background-position:-375px -250px;"><img src="images/thumbs/16.jpg" alt="16" /></div>
<div style="background-position:-500px -250px;"><img src="images/thumbs/17.jpg" alt="17" /></div>
<div style="background-position:-625px -250px;"><img src="images/thumbs/18.jpg" alt="18" /></div>
<div style="background-position:-0px -375px;"><img src="images/thumbs/19.jpg" alt="19" /></div>
<div style="background-position:-125px -375px;"><img src="images/thumbs/20.jpg" alt="20" /></div>
<div style="background-position:-250px -375px;"><img src="images/thumbs/21.jpg" alt="21" /></div>
<div style="background-position:-375px -375px;"><img src="images/thumbs/22.jpg" alt="22" /></div>
<div style="background-position:-500px -375px;"><img src="images/thumbs/23.jpg" alt="23" /></div>
<div style="background-position:-625px -375px;"><img src="images/thumbs/24.jpg" alt="24" /></div>
Je me rends compte que j'ai besoin de boucle (en quelque sorte) et de tenir un compte (en quelque sorte) et ayant vu de nombreuses boucle de comptage et des exemples que j'ai attendu le processus d'être franc mais ensuite j'ai lu sur position()
et number
et bien d'autres choses que ma tête tourne. Je n'ai aucune idée de comment ou où la position de la boucle de comptage dans un for-each
déclaration, ou même si un for-each
est la meilleure solution. Aucun de mes faibles tentatives produit bien formé XSL de sorte que vous pouvez le voir, je suis pas rapide.
Donc ici en espérant un des gourous ici peut m'aider à démarrer le processus et de les aider dans ma compréhension de xslt.
Les données de l'image est à venir à partir d'un fichier XML et je suis en mesure de traiter les img src et alt sans problème donc, c'est juste le pixel calculs, boucles de comptage, etc ... qui est le problème
<xsl:for-each select="DATASET/ITEM">
<div style="background-position:-{rowpos}px -{colpos}px;"><img src="{thumbnailimage}" alt="{imagealttext}" /></div>
</xsl:for-each>
<!-- rowpos and colpos are the calculated values that are generated from whatever loop and count process is used -->
Donc pour la clarification:
Calcul. Il y a 3 variables qui serait de produire des 6 valeurs calculées. tw=125. La largeur est utilisé pour le fond des positions en fonction de la ligne/colonne, les valeurs calculées sont comme illustré dans l'exemple - par exemple tw-tw tw tw*2, tw*3, tw*4 et tw*5 (sur un total de 6 calculs). Le nombre de lignes et nombre de colonnes détermine comment et où chaque vignette est positionné à l'aide de l'calculé les valeurs de pixel - qui, dans le cas ci-dessus sont à 0px, -125px, -250px, -375px, -500px et -675px.
La poursuite de l'expansion des calculs:- de Ligne et de Colonne positions sont déterminées par la largeur d'une image miniature. La position de chaque vignette est déterminé par le nombre de lignes et nombre de colonnes. Un 3 ligne 3 de la colonne de la grille avec 150px de large pouces exigera 9 vignettes donc 9 jeux de px valeurs, mais seulement 2 unique calculs seraient requis, par exemple tw*2 et tw*3 comme indiqué ci-dessous:-
<div style="background-position: -0px -0px;" /><img src="image 1.jpg" alt="Alt text 1" /></div>
<div style="background-position: -125px -0px;" /><img src="image 2.jpg" alt="Alt text 2" /></div>
<div style="background-position: -250px -0px;" /><img src="image 3.jpg" alt="Alt text 3" /></div>
<div style="background-position: -375px -0px;" /><img src="image 4.jpg" alt="Alt text 4" /></div>
<div style="background-position: -500px -0px;" /><img src="image 5.jpg" alt="Alt text 5" /></div>
<div style="background-position: -0px -125px;" /><img src="image 6.jpg" alt="Alt text 6" /></div>
<div style="background-position: -125px -125px;" /><img src="image 7.jpg" alt="Alt text 7" /></div>
<div style="background-position: -250px -125px;" /><img src="image 8.jpg" alt="Alt text 8" /></div>
<div style="background-position: -375px -125px;" /><img src="image 9.jpg" alt="Alt text 9" /></div>
<div style="background-position: -500px -125px;" /><img src="image 10.jpg" alt="Alt text 10" /></div>
<div style="background-position: -0px -250px;" /><img src="image 11.jpg" alt="Alt text 11" /></div>
<div style="background-position: -125px -250px;" /><img src="image 12.jpg" alt="Alt text 12" /></div>
<div style="background-position: -250px -250px;" /><img src="image 13.jpg" alt="Alt text 13" /></div>
<div style="background-position: -375px -250px;" /><img src="image 14.jpg" alt="Alt text 14" /></div>
<div style="background-position: -500px -250px;" /><img src="image 15.jpg" alt="Alt text 15" /></div>
<div style="background-position: -0px -375px;" /><img src="image 16.jpg" alt="Alt text 16" /></div>
<div style="background-position: -125px -375px;" /><img src="image 17.jpg" alt="Alt text 17" /></div>
<div style="background-position: -250px -375px;" /><img src="image 18.jpg" alt="Alt text 18" /></div>
<div style="background-position: -375px -375px;" /><img src="image 19.jpg" alt="Alt text 19" /></div>
<div style="background-position: -500px -375px;" /><img src="image 20.jpg" alt="Alt text 20" /></div>
Fichier XML L'image src et alt texte est à partir d'un fichier XML:-
<DATASET>
<ITEM>
<THUMBNAILIMAGE>image1.jpg</THUMBNAILIMAGE>
<IMAGEALTTEXT>Alt text 1</IMAGEALTTEXT>
</ITEM>
<ITEM>
<THUMBNAILIMAGE>image2.jpg</THUMBNAILIMAGE>
<IMAGEALTTEXT>Alt text 2</IMAGEALTTEXT>
</ITEM>
......
<ITEM>
<THUMBNAILIMAGE>image20.jpg</THUMBNAILIMAGE>
<IMAGEALTTEXT>Alt text 20</IMAGEALTTEXT>
</ITEM>
</DATASET>
J'avais espéré te répondre...mais pas de cette façon :(. Je pensais que la question était claire - comment puis-je réaliser les calculs par l'intermédiaire d'un processus en boucle et à écrire le code html dans l'exemple illustré. Que dois-je besoin de fournir. Il n'existe pas de fichier XML en tant que tel. Le XSLT sera passé trois paramètres - tw, cols, des lignes. Désolé, je ne comprends pas les exigences de transformation question. Tout ce que je veux faire est de placer correctement calculé les valeurs des pixels de ROWPOS et COLPOS en utilisant correctement écrit xslt.
Calculer ce? les règles pour le calcul? Comment les valeurs pour les positions seront-ils générés? À l'aide de ce les règles? Comment pouvez-vous dire que "Il n'existe pas de fichier XML en tant que telle" lors de votre code contient l'expression XPath
DATASET/ITEM
??? Pourquoi les gens doivent se poser ces questions ou à deviner? Toute cette information importante doit être dans la question, ou bien la question n'est pas significatif.PBB: ROWPOS et COLPOS sont des noms (dans la voie écrite) doit appartenir dans le document XML source -- certes cela ajoute à la confusion.
PBB: Donner à tous cette information nécessaire est une bonne première étape. Maintenant, pour en faire une bonne question, pourriez-vous, s'il vous plaît, de modifier et de mettre toutes les informations à partir de vos commentaires dans le texte de la question elle-même? Vous pouvez en plus de lire Jon Skeet blog sur comment écrire une bonne question, je pense, un lien à ce qui peut être trouvé dans la Faq de la SORTE. La plus importante chose à apprendre est de savoir comment poser une bonne question. Plusieurs fois, juste en suivant les directives pour la définition d'une question dans le bon sens, aide à la personne pour mieux comprendre le problème et de trouver une solution.
OriginalL'auteur PBB | 2012-06-02
Vous devez vous connecter pour publier un commentaire.
Ici est complète, plus court et plus simple (un seul modèle récursif), récursive, XSLT 1.0 transformation:
Lorsque cette transformation est appliquée au document XML fourni par le:
le voulait, résultat correct est produit:
Explication:
C'est une solution récursive. Une non-solution récursive (aka le Piez méthode) est possible, si il est garanti que le nombre d'itérations ne dépasse pas le nombre total de nœuds disponibles (dans le source XML de recherche(s) et la feuille de style XSLT).
Condition d'arrêt: La ligne en cours-numéro de valeur devient plus grand que le paramètre nombre spécifié de lignes (
$pRow > $pNumRows
).Action: Générer les nouvelles
div
élément, puis obtenir les valeurs de la colonne numéro de ligne et le numéro avec lequel effectuer l'action suivante.<img src="{thumbnailimage}" alt="{imagealttext}" />
.D'abord il suffit d'exécuter la transformation avec n'importe quel document XML (comme
<t/>
pour vous assurer que vous obtenez le même résultat. Puis modifier la question pour être utile (mais aussi petit que possible) document XML et également modifier le résultat voulu à la hauteur de ce document XML. Enfin, s'il vous plaît, me prévenir par un commentaire et je vais mettre à jour cette réponse de travailler avec le document XML et de produire le résultat voulu. Comme pour le droit de vote, droit maintenant, vous pouvez accepter une réponse (en cliquant sur la coche à côté d'elle). Vous aurez le droit à upvote chaque fois que vous atteignez 50 points de rep. Vous mai besoin de plus de rep pour downvotingdésolé, comme je l'ai dit "néophyte", donc je n'ai aucune idée de comment le transformer "avec un document xml comme <t/>".
Cela signifie pour l'exécution de votre processeur XSLT avec saisie de tout document XML source (tels que le document XML
<t/>
) et avec le programme de transformation. Généralement le document XML source et la transformation de résider dans leurs propres fichiers et le système de fichiers chemins d'accès complet à ces deux fichiers sont fournis pour le processeur XSLT (je me réfère ici à l'exécution de ligne de commande de l'utilitaire que près de 100% des processeurs XSLT). Par conséquent, vous avez besoin d'avoir un processeur XSLT installé et lire comment invoquer son utilitaire de ligne de commande et la façon de spécifier les paramètres nécessaires.Dimitre - il a l'air bon, pas bon mais proche!!!! Tout le background-position calculs sont exacts. Mais l'image des noms de sortir de la séquence. Pour un 5 ligne, 4 col ensemble je devrais obtenir des images de la séquence 1 à 20, mais je reçois 1,2,3,4,5, 2,4,6,8,10, 3,6,9,12,15, 4,8,12,16,20 mais je suis sûr que cela fonctionne quand vous me montrer comment ramasser les bonnes images et de corriger alt de texte à partir de l'ensemble de données. J'ai téléchargé un fichier de log qui fournit toutes les données dont vous avez besoin. lien
OriginalL'auteur Dimitre Novatchev
Je pense que cela pourrait faire à l'aide du code ci-dessous (XSLT 1.0).
La transformation suivante doit aller avec n'importe quel fichier XML.
EDIT:
En XSLT, il est impossible de construire des boucles semblables à celles en C++ ou en Java, car il est impossible de changer la valeur d'une variable (de sorte qu'il est impossible d'avoir un compteur). Mais il est possible de remplacer les itérations avec la récidive.
Dans ma solution, j'ai défini deux, de manière répétitive, appelés modèles - le premier est nommé
iterate_rows
, tandis que la seconde estiterate_cols
. Le point d'entrée pour l'ensemble du programme est:C'est invoqué en premier lieu. Le modèle nommé
iterate_rows
a un paramètrenum
et il a une valeur par défaut à 0. L'important, c'est la<xsl:if ...>
condition qui vérifie si nous avons atteint la fin de la boucle (dans ce cas, il serait la valeur de$ROWS
).À l'intérieur de l'état de bloc, nous avons deux appels: on exécute
iterate_cols
modèle et le second est l'appel àiterate_rows
modèle lui-même (remarque: nous l'appelons avec incrémenté paramètrenum
). Le deuxième modèle fonctionne de manière similaire. Espérons que cette aide.voir mon edit...
L'explication est d'une grande aide. Encore un grand merci pour la rapidité et de votre patience. Je vais essayer le code maintenant et de revenir à vous.
OriginalL'auteur Lukasz
Dans XSLT 2.0, c'est simple: c'est quelque chose comme:
En 1.0 vous n'avez pas le luxe de
select="1 to $rows"
, mais un populaire solution de contournement consiste à utiliserselect="(//*)[position() <= $rows]"
, qui fonctionne à condition qu'il existe au moins $lignes éléments dans le document source. Vous n'êtes pas vraiment intéressé par les nœuds sélectionnés, seulement dans la façon dont beaucoup d'entre eux y sont, qui détermine le nombre de fois que vous exécutez la boucle.OriginalL'auteur Michael Kay