[XPath] Incrémentation de paramètres

Eléphant du PHP | 71 Messages

02 mars 2007, 11:15

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:
Modifié en dernier par Chakra Spirit le 02 mars 2007, 12:48, modifié 1 fois.

Eléphant du PHP | 71 Messages

02 mars 2007, 12:20

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 :? )

ViPHP
ViPHP | 4674 Messages

02 mars 2007, 13:03

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Invité
Invité n'ayant pas de compte PHPfrance

02 mars 2007, 22:02

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:

@+

Eléphant du PHP | 71 Messages

02 mars 2007, 22:04

erf... /me suis encore loupé sur la connexion... :roll:

Eléphant du PHP | 71 Messages

02 mars 2007, 22:40

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

08 mars 2007, 15:26

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.

Eléphant du PHP | 71 Messages

14 mars 2007, 10:25

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: