Page 1 sur 1

[XPath] Incrémentation de paramètres

Posté : 02 mars 2007, 11:15
par Chakra Spirit
Bien le bonjour :)

Je bosse actuellement sur un formulaire et j'éprouve quelques difficultés pour récupérer les valeurs provenant de ma db.

En gros, j'ai un fichier xml du type :

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8"?> <form> <group id="ident"> <ent id="nom" type="recq"/> <ent id="prenom" type="recq"/> </group> <group id="coord"> ... </group> ... </form>
auquel j'applique une feuille xsl dans laquelle je récupère mes divers paramètres (provenant de la db). Je les récupère comme suit :

Code : Tout sélectionner

<xsl:param name="dbFieldIdent"/> <xsl:param name="dbFieldCoord"/> ...
Dans cette feuille, se trouvent des modèles du type :

Code : Tout sélectionner

<xsl:template match="group"> <fieldset xmlns="http://www.w3.org/1999/xhtml"> <legend><xsl:value-of select="$dbField..."/></legend> <xsl:apply-template match="ent"/> </fieldset> </xsl:template>
qui ici s'applique donc à tous les éléments group de mon xml. Le soucis, c'est le xsl:value-of : comment faire pour incrémenter mes paramètres ? (lui dire, la 1ère fois tu prends $dbFieldIdent, la 2ème fois, $dbFieldCoord, etc...)

Existe-t-il quelquechose en XPath qui me permette de le faire ou dois-je m'y prendre autrement ? ... parce que des group, j'en ai quelques-uns alors je me vois mal tous les différencier un par un... Je l'ai fais la première fois, au final ma feuille xsl faisait 28ko; c'est pas glop à gérer. :? Si je pouvais conserver mes templates, ce serait sympa quand même. :lol:

Posté : 02 mars 2007, 12:20
par Chakra Spirit
Je viens de tomber là-dessus :

http://fr.selfhtml.org/xml/representati ... m#variable

Si j'ai bien compris, ça devrait donner quelquechose comme çà :

Code : Tout sélectionner

<xsl:param name="dbFieldIdent"/> <xsl:param name="dbFieldCoord"/> ... <xsl:param name="dbFieldSitu"/>

Code : Tout sélectionner

<xsl:template match="group"> <fieldset xmlns="http://www.w3.org/1999/xhtml"> <xsl:variable name="monparam"> <xsl:choose> <xsl:when test="@id = 'ident'"><xsl:value-of select="$dbFieldIdent"/></xsl:when> <xsl:when test="@id = 'coord'"><xsl:value-of select="$dbFieldCoord"/></xsl:when> ... <xsl:otherwise><xsl:value-of select="$dbFieldSitu"/></xsl:otherwise> </xsl:choose> </xsl:variable> <legend><xsl:value-of select="$monParam"/></legend> <xsl:apply-template match="ent"/> </fieldset> </xsl:template>
Va falloir que je teste en rentrant... Je vous tiens au courant. :) (En attendant, je trouve ça super verbeux pour ce que je souhaite faire :? )

Posté : 02 mars 2007, 13:03
par Hywan
Bonjour :)

A mon avis je vais répondre complètement à côté, mais bon : jme lance :P

Je connais pas énormément XLS, mais il ressemble parfois à CSS (d'après ce que j'en connais).
Je peux donc espérer qu'il ai grosso modo les mêmes commandes.
Une commande intéressante en CSS est celle-ci : 12 Generated content, automatic numbering, and lists > 12.4 Automatic counters and numbering.
Ça permet de compter en CSS.

Si cette commande a un équivalent en XLS, tu pourrais peut être regarder de ce côté.

Là j'avoue que j'ai pas d'idée à part celle-là.
Si j'ai pu t'aider, tant mieux :)


Bonne journée.

Posté : 02 mars 2007, 22:02
par Invité
Salut HyWaN, :wink:

J'avais effectivement pensé à cette notion de compteur donc je me suis naturellement tourné du côté de l'élément xsl:number mais il semble que ce soit plus pour affecter une numérotation à différentes valeurs... ce qui n'était pas vraiment ce que je recherchais puisque tous mes paramètres étaient déjà nommés. :)

En tout cas, ce que j'indique ci-dessus fonctionne bien... Comme quoi, des fois, il suffit de poster un petit mot sur le forum pour que ça décoince... :lol:

Merci pour ta suggestion en tout cas. :wink:

@+

Posté : 02 mars 2007, 22:04
par Chakra Spirit
erf... /me suis encore loupé sur la connexion... :roll:

Posté : 02 mars 2007, 22:40
par Chakra Spirit
bon, c'est bien ce que je pensais.. On peut remplacer xsl:choose par des xsl:if... c'est plus court :

Code : Tout sélectionner

<xsl:variable name="monparam"> <xsl:if test="@id = 'ident'"><xsl:value-of select="$dbFieldIdent"/></xsl:if> <xsl:if test="@id = 'coord'"><xsl:value-of select="$dbFieldCoord"/></xsl:if> ... <xsl:if test="@id = 'situ'"><xsl:value-of select="$dbFieldSitu"/></xsl:if> </xsl:variable>
... et une fois de plus, je me dis que xsl:choose, ça ne sert à rien mis à part bouffer de l'octet... :P

Posté : 08 mars 2007, 15:26
par Hubert Roksor
je me dis que xsl:choose, ça ne sert à rien mis à part bouffer de l'octet... :P
xsl:choose a l'avantage de posséder xsl:otherwise contrairement à xsl:if (XSLT < 2.0) et il y a sûrement quelques optimisations en internes pour passer les tests inutiles une fois le bon xsl:when trouvé.

À part ça, je n'ai pas tout compris au sujet et je serais curieux de savoir quelle solution tu as trouvé. Est-ce que tu pourrais nous montrer un exemple raccourci des fichiers XML et XSL pour me donner une idée du résultat recherché ? Merci d'avance.

Posté : 14 mars 2007, 10:25
par Chakra Spirit
oups... désolé... je n'avais pas vu ta réponse Hubert. :?

hum... bon, je n'ai pas ces fichiers au bureau donc je peux te montrer ça plus tard (du moins en partie parce que le xsl est assez flippant -> + de 30ko)

En gros, je me suis servi jusqu'à maintenant de xsl:if lorsque j'étais susceptible de préciser mes conditions... c'est à dire tout le temps étant donné que dans un xsl:if j'indique un booléen et qu'il m'était du coup facile de déterminer le cas opposé.
xsl:choose a l'avantage de posséder xsl:otherwise contrairement à xsl:if (XSLT < 2.0) et il y a sûrement quelques optimisations en internes pour passer les tests inutiles une fois le bon xsl:when trouvé.
oui, en effet, ça parait logique. :) Si je cerne bien, il semblerait que le xsl:choose puisse être apparenté à un switch (php, js, etc...)
À part ça, je n'ai pas tout compris au sujet et je serais curieux de savoir quelle solution tu as trouvé. Est-ce que tu pourrais nous montrer un exemple raccourci des fichiers XML et XSL pour me donner une idée du résultat recherché ?
Mon but, c'est de faire un formulaire qui permet de créer son cv. (Je compte le décliner sous différents formats -> page web, pdf ou autre)

Ce qui me pose problème, c'est lorsque le contenu du formulaire est invalide et qu'il faut le réafficher :

- en précisant les erreurs via une classe css qui entoure le champ erroné
- en réinsérant toutes les données entrées au sein des champs du formulaire
- en intégrant un message d'erreur explicatif à proximité du champ erroné.

Je me retrouvais donc à cinder la feuille xsl en deux :

- le formulaire à remplir
- le formulaire à modifier

Au sein du formulaire à modifier, je multipliais les conditions pour n'afficher une classe et un message d'erreur associé que dans le cas où le champ était erroné...

Ayant plus de 30 champs différents, ben c'est un peu le désastre à gérer. :?

arf.. bon, je ne suis pas sûr d'être clair donc je retransmettrais un code simplifié qui suit le même principe. :wink: