STIC Discussion:STIC II - exercice 10/Archive Qwerty

De EduTech Wiki
Aller à la navigation Aller à la recherche

Voir aussi: STIC Discussion:STIC I - exercice 2 (Nestor-Pixel)

QUESTION 1 - saut de ligne dans fichier xml

Bonjour. J'ai quelques problèmes avec mon CV que je voulais juste finir avant de commencer l'exercice. D'abord la première question: Est-ce que je peux donner mon CV comme exercice, parce qu'il contient une grande partie des contraintes exigées. Je vais de toute façon refaire quelque chose de plus "Tecfa", mais je n'aurais peut-être pas le temps d'aller aussi loin. Ensuite, et cela pourrait être très agréable pour la rédaction des rapports, mais pour bien d'autres choses, j'avais cru comprendre qu'il existait un moyen pour que les retours à la lignes du contenu xml soient pris en compte dans la mise en page html: l'attribut preserve-space (<xsl:preserve-space elements="list-of-element-names"/>). J'ai essayé de mettre en haut du document, après la ligne <xsl:stylsheet...

<xsl:preserve-space elements="root"/>

ou des éléments plus spécifiques

<xsl:preserve-space elements="objectifs difficultes"/>,

mais ça ne marche pas. Il est pourtant dit que preserve-space est l'attribut par défaut, mais en aucun cas les espaces sont préservés dans mes rapports travaux. Comment faut-il faire pour mettre cela en place?

Re: QUESTION 1 - saut de ligne dans fichier xml -- Daniel K. Schneider 25 février 2011 à 16:08 (CET)

Non, preserve space fait just que cela dit et cela n'a aucun impact sur la mise en page.

Il est possible de faire ce que voulez, mais je déconseille. Il est plus rationnel et plus rapide de "paragrapher" votre text et cela ne demande qu'une modification mineure: (a) a mettre des balises "para" autour de chaque paragraphe et (b) changer la DTD.

Sinon, va falloir apprendre nettement plus de XSLT et aussi savoir gérer 2 sortes de retours de ligne. Suivant la machine que vous utilisez, une nouvelle ligne est soit un ctrl-J (LF) ou un LF plus un CR (ctrl-M). Vous pouvez googler des solutions, par exemple

Re: Re: QUESTION 1 - saut de ligne dans fichier xml -- Daniel K. Schneider 25 février 2011 à 16:19 (CET)

Oui vous pouvez soumettre votre CV ... c'est un peu limite (donc sur ce point cela comptera un peu moins, mais c'est une facteur sur 10 seulement ...)

Re: Re: Re: QUESTION 1 - saut de ligne dans fichier xml -- Lucie.Marchon 25 février 2011 à 21:59 (CET)
Y a des tas d'attributs possibles! Ça me dit bien d'en apprendre un peu plus.. : )
Re: Re: Re: Re: QUESTION 1 - saut de ligne dans fichier xml -- Daniel K. Schneider 25 février 2011 à 23:13 (CET)

Je vous ai montré à peu près 5-10% de XSLT :)

Ceci dit, j'insiste, vous devez modifier le XML du CV pour y mettre des balises de paragraphe ou à limite des breaks. Utiliser les fonctions string de XSLT/XPATH ne fait que du sens si vous avez quelques milliers de lignes de "legacy" text à transformer. Dans HTML insérer des lignes blanches n'a pas non plus aucun effect ....

QUESTION 2 - plusieurs formes pour le contenu xml -- Lucie.Marchon 27 février 2011 à 16:22 (CET)

J'aimerais bien faire deux choses, et cela me semble un peu plus difficile que j'imaginais... 1) Simplement avoir deux feuilles de styles pour un même doc .xml (pour avoir une organisation différente des contenus). Par où il faut aller pour arriver à faire cela? 2)Dans un même document, réutiliser les contenus (pour un résumé, par exemple, ou un menu) avec des templates différents. Est-ce possible et comment il faut réfléchir pour faire ça?

Merci d'avance!

Re: QUESTION 2 - plusieurs formes pour le contenu xml -- Lucie.Marchon 27 février 2011 à 21:16 (CET)

Je commence à m'en sortir, pour la question 2), il faut mettre mode="" et on peut spécifier un autre type de template. : )

Re: QUESTION 2 - plusieurs formes pour le contenu xml -- Lucie.Marchon 27 février 2011 à 21:16 (CET)

Mais ensuite, je me demande comment on peut intégrer du contenu xml comme ancre. Est-ce que c'est seulement possible, parce que ce que je vois sur les forums m'a l'air compliqué!

Re: Re: QUESTION 2 - plusieurs formes pour le contenu xml -- Lucie.Marchon 27 février 2011 à 22:07 (CET)

C'est bon, j'ai réussi: pour la cible

<a href="#{nom-xml}"></a>

(avec le texte du lien entre les ><)

pour l'ancre:

<a name="{nom-xml}"/>

QUESTION 3 - deux questions qui restent -- Lucie.Marchon 27 février 2011 à 22:28 (CET)

Bon, comme je persiste souvent au-delà de la demi-heure, je me réponds la plupart du temps à moi-même... Qu'à cela ne tienne, je pose tout de même mes questions, au cas où je ne trouverais aucune réponse malgré mes efforts.

Les questions qui me restent: 1) est-ce qu'on peut appliquer deux fichiers (xslt) à un même contenu xml? cela me paraît difficile, car la référence au fichier xslt est contenue dans le fichier xml, et non le contraire (Évidemment, puisque le navigateur lit d'abord le fichier xml..). Mais alors comment faire, par exemple, pour utiliser le même contenu dans une mise en page tout à fait différente, en tableau, en résumé, etc.

2) Peut-on faire référence à un fichier xml autre que le fichier principal (mon exemple, c'est le cas d'un menu déroulant, où j'aimerais pouvoir dans une seconde page avoir les références de la première pour que le menu en arborescence puisse être actualisé comme il faut.) et comment faire?

Merci : )

Re: QUESTION 3 - deux questions qui restent -- Lucie.Marchon 27 février 2011 à 23:17 (CET)

ce que j'arrive maintenant à faire, c'est à récupérer tout le contenu d'un autre document avec:

<xsl:apply-templates select="document('autre_document.xml')"/>

mais comment sélectionner les noeuds qui m'intéressent?

Re: Re: QUESTION 3 - deux questions qui restent -- Lucie.Marchon 27 février 2011 à 23:26 (CET)

Bon, je m'en sors de mieux en mieux:

<xsl:apply-templates select="document('autre_document.xml')/noeud1/noeud2/nom_rubrique"/>

Je regarde si j'arrive à faire ce que je veux...

... mais non je n'y arrive pas. Je sollicite de l'aide.

Sur ma page travaux, j'ai réussi à faire en sorte que le menu soit lié à au fichier xml, c'est-à-dire que si l'on rajoute un cours, il se rajoute automatiquement sur le menu, et une ancre se met à côté de l'intitulé du cours. C'est déjà pas mal.. : ) Sur la page currriculum, je voudrais qu'il y ait les mêmes liens sur le menu déroulant, mais il y a uniquement les noms des cours qui s'affichent à la suite sans espace, et je ne sais pas comment faire le lien sur une autre page (comment en quelque sorte concaténer une ancre #{document('../welcome.xml')/student/courses/course/title} avec le lien vers l'autre page. voilà le fichier .xsl ainsi que le .css (est-ce qu'on les appelle les deux des feuilles de styles?) Est-ce que vous arrivez à voir rapidement comment je devrais réfléchir pour m'en sortir? Merci!

Re: Re: Re: QUESTION 3 - deux questions qui restent -- Lucie.Marchon 28 février 2011 à 10:10 (CET)

ok, c'est bon: il faut appliquer les mêmes templates que sur la page initiale avec

 
href="http://tecfaetu.unige.ch/etu-maltt/qwerty/marchonl/welcome.xml#{title}"

pour définir l'ancre... (sachant que l'on est déjà dans le fichier externe dans le template)

Merci Lucie ; )

Re: QUESTION 3 - deux questions qui restent -- Lucie.Marchon 27 février 2011 à 23:17 (CET)

Donc, la question qui me reste est la première: 1) est-ce qu'on peut appliquer deux fichiers (xslt) à un même contenu xml? cela me paraît difficile, car la référence au fichier xslt est contenue dans le fichier xml, et non le contraire (Évidemment, puisque le navigateur lit d'abord le fichier xml..). Mais alors comment faire, par exemple, pour utiliser le même contenu dans une mise en page tout à fait différente, en tableau, en résumé, voire en pdf, etc.

Est-ce que quelqu'un peut m'aider à y répondre? Merci!

Re: Re: QUESTION 3 - deux questions qui restent -- Daniel K. Schneider 28 février 2011 à 12:42 (CET)

Difficile à répondre. On peut le faire, mais c'est très difficile car cela implique de la programmation DOM avec JavaScript. Ceci dit, pour se faciliter la tâche on peut utiliser une librairie JS comme JQUERY. Par exemple http://www.kelvinluck.com/2009/07/jquery-styleswitch-now-with-toggle/

Il reste 2 solutions simples:

1) Duplifier le XML et attacher un XSLT différent pour chaque fichier. Évidemment pas pratique, car il faudra toujours éditer les deux fichiers. Ceci dit, il est possible d'inclure un fichier XML dans un autre en utilisant une entité XML. Donc le fichier à inclure contiendra le vrai contenu et les 2 autres fichiers juste la feuille de style.

Cela implique que chaque version a un URL different.

2) Le faire server-side avec PHP. Sans doute la solution la plus simple. MAIS: XSLT n'est pas installé comme module PHP sur les serveurs tecfaetu et tecfa. Vais voir, si on peut faire qc. (mais pas aujourd'hui). Correction, cela marche maintenant sur le serveur TECFA. Pour la machine étudiant(e)s, je vais voir avec Stéphane car c'est lui qui installé cette machine.... http://tecfa.unige.ch/guides/php/examples/xslt/php-xslt-select.phps (et lire le code source)

Cela implique un parametre à passer dans l'URL.

Re: Re: Re: QUESTION 3 - deux questions qui restent -- Lucie.Marchon 28 février 2011 à 23:02 (CET)

Je suis trop impressionnée par le php pour me lancer dans le temps qui me reste. J'ai pris la première solution. Je garde ce fil sous le coude pour plus tard. Merci!

Re: Re: Re: Re: QUESTION 3 - deux questions qui restent -- Jaboulay 4 mars 2011 à 14:04 (CET)

J'ai eu le même problème, car j'ai fabriqué un menu déroulant qui offre le choix entre trois rapports. Mais bon, l'idéal, c'est de faire du server-side scripting, surtout que en ce qui me concerne, je suis contre l'utilisation des fichier xml comme source de donnée originelle. Les données réutilisables devraient toujours être stockées dans une base de donnée relationnelle et les xml être générés dynamiquement. Le seul cas où je suis pour stocker le xml dans des fichiers, c'est lorsqu'il y a un contexte d'utilisation en offline.

Par ailleurs, j'ai découvert un problème avec un tag incompatible dans le xslt: la génération de la page ne donne rien (plantage?) si le tag « selected » est inclu dans une des options de la liste déroulante de type "select". J'ai donc retiré ce tag de la première option et tout fonctionne.

=Re: Re: Re: Re: Re: QUESTION 3 - deux questions qui restent -- Daniel K. Schneider 4 mars 2011 à 14:42 (CET)=

En ce qui concerne XML comme source je ne suis pas du tout d'accord. Une base de données et figée et cela marche surtout pour tout ce qui est données inintéressantes ... genre liste de CDs, blogs, fiches de produits, fiches de paye etc. Faire une base de données relationnelle pour un XML même très banal est assez complexe (une table pour chaque élément). En fait, il y a très peu d'applications BD qui ont des contenus autres que des simples listes reliées. Word, e-pub, SVG, e-learning ... tout cela reste en XML ! On peut aussi constater qu'il n'y a presque pas de bases de données "riches" sur le web, car la plupart des contenus riches sont non-structurées. La solution pour stocker du XML complexe est une base de données XML. Elles existent, mais sont peu utilisés. A mon avis en grande partie parce que toute nouveauté en informatique met au moins ans à se mettre en place. Ensuite, faut ajouter 10 ans pour que les informaticiens acceptent et apprennent. SQL c'est 1970 et c'est pour cela que les gens l'aiment ;=) Cf. en:XML database, en:XQuery tutorial - basics, etc.

Puis, faudrait me montrer l'exemple avec le select ... à mon avis vous avez du faire une erreur genre oublié de coder la sortie en format compatible XML (ou alternativement ne pas avoir utilisé un xsl:text si vous faites du HTML à l'ancienne).

<option value="xxx" selected="selected">YYYY</option>

ou alors: <option value="xxx" <xsl:text>selected</xsl:text>YYYY</option>

Un fichier XSLT doit être XML, c-a-d. bien formé (chaque attibut doit avoir une valeur) !

Y a pas des bugs aussi simples dans les processeurs XSLT, c'est une technologie vielle de 15 ans ou presque :)

Contribution wiki -- Nancy 12 mars 2011 à 18:10 (CET)

J'ai une question par rapport à la contribution Wiki pour l'exercice 10. Est-ce qu'il faut faire son propre homepage avec comme contenu ses propres contributions Wiki ou faudrait-il faire comme avant, c'est-à-dire compléter des pages wiki existantes qui sont proposées dans les consignes ?

Re: Contribution wiki -- Daniel K. Schneider 12 mars 2011 à 20:12 (CET)

Il faut compléter (ou créer) des pages qui sont en rapport avec la thématique de l'exercice, donc si vous pouvez compléter les propositions c'est bien, mais ce n'est pas une obligation. La logique est la même que pour STIC-I, écrire vous (a) permet d'apprendre qc. et/ou (b) de partager qc. que vous avez appris et/ou (c) de corriger mes tutoriels.

Ensuite il ne faut pas oublier de mentionner ce que vous avez fait dans votre rapport et dans la page travaux.

Finalement, il faudrait aussi essayer d'apprendre un peu la syntaxe wiki. Par exemple, une page discussion est une page wiki tout à fait normale et on peut donc l'éditer (par exemple corriger un intitulé qui ne fait pas de sens ....)

Re: Re: Contribution wiki -- Nancy 13 mars 2011 à 10:30 (CET)

Merci beaucoup pour votre réponse. J'ai un problème à associer mes fichiers livre.css et livre.xsl à mon fichier livre.xml. J'ai mis les liens des différents fichiers sur ma page http://tecfaetu.unige.ch/etu-maltt/qwerty/schuwen0/stic2/ex10/ rubrique Résultats. Merci d'avance pour votre aide.

Re: Re: Re: Contribution wiki -- Daniel K. Schneider 13 mars 2011 à 13:29 (CET)

SVP commencez un nouveau sujet lorsque vous posez une autre question (c.f. message précédant). Il faut s'habituer à utiliser wikis et forums comme il faut.

En ce qui concerne votre question:

(1) Je vous conseille d'abord de produire un XML correct. Pas nécessaire pour que la feuille de style marche, mais pour obtenir une note correcte pour l'exercice. Votre XML ne valide absolument pas, c.a.d la DTD ne correspond pas au fichier XML.

En particulier:

  • Se décider si vous voulez travailler avec des éléments ou des attributs (Votre DTD contient des attributs, alors que votre XML ne contient que des éléments....)

Exemples:

<!ELEMENT auteur EMPTY>
 n'est pas du tout empty selon votre XML ! Faudrait qc. comme
<!ELEMENT auteur (nom, prenom) >
  • Utilisez un bon éditer XML et validez (!) .... ne jamais taper les balises à la main !

(2) Faites du XSLT simple: une règle pour chaque balise comme je vous l'ai montré, n'utilisez pas de boucles. Autrement dit, évitez de lire des livres fait par de gens qui ne comprennent pas bien la logique de XSLT.

Votre XSLT contient une erreur et s'est pour cela que la transformation ne joue pas. Mais cela ne sert à rien de chercher à la réparer, car comme je l'ai dit: Il faut faire simple et repenser le tout. Par ailleurs, un bon éditeur XSLT comme Exchanger valide le XSLT et affiche les erreurs ....

(3) Regardez un example et essayez de comprendre comment il marche. Je conseille:

http://tecfa.unige.ch/guides/xml/examples/dtd-examples/cuisine.xml
http://tecfa.unige.ch/guides/xml/examples/dtd-examples/cuisine.xsl

Re: Re: Re: Re: Contribution wiki -- Nancy 13 mars 2011 à 17:30 (CET)

J'ai modifié mes fichiers livre.xml, livre.dtd, livre.xsl, livre.xslt mais je n'arrive pas toujours à faire afficher les auteurs malgré que j'ai modifié le DTD comme vous avez mentionné ci-dessus ni à énumérer le Titre, Section, Chapitre, Paragraphe l'un en dessous de l'autre.

Re: Re: Re: Re: Contribution wiki -- Daniel K. Schneider 13 mars 2011 à 20:20 (CET)

Je vous conseille 2 choses:

  1. N'utilisez que des éléments (pas des attributs) dans votre DTD. Par ailleurs votre XML ne valide toujours pas.
  2. Utilisez des templates simples dans votre XSLT, donc comme j'ai écrit dans mon message précédant: une simple règle pour chaque balise XML. Je ne vais pas vous aider à faire des boucles car c'est inutilement compliqué et en plus trop difficile pour une débutante....

J'ajoute un 3ème conseil (enfin c'est plus compliqué):

  • Installez l'éditeur XML que j'ai conseillé (Exchanger), ensuite utilisez le debugger pour voir comment votre code XSLT est exécuté. (c.f. en:Exchanger XML Editor
  • Au moins, vous devez examiner le résultat produit par XSLT (donc pas le debugger). Vous verrez que votre code XSLT ne produit pas du HTML. Pour finir: Pourquoi simplement regarder l'exemple indiqué ci-dessus ?

Re: Re: Re: Re: Re: Contribution wiki -- Nancy 18 mars 2011 à 00:26 (CET)

J'ai modifié mon DTD en ne mettant que des éléments. J'ai également modifié mon XML en n'utilisant pas d'attributs mais quand je fais un lien "lien vers mon fichier xml" dans ma page d'accueil Welcome, je n'arrive plus à afficher ma page XML si bien que j'ai dû taper le code XML dans mon rapport. J'ai utilisé le debugger pour voir comment mon code XSLT est exécuté mais je n'ai aucune information dans Exchanger XSLT debugger. J'avoue que je suis un peu perdue...

Re: Re: Re: Re: Re: Re: Contribution wiki -- Daniel K. Schneider 18 mars 2011 à 01:35 (CET)

Votre fichier xml est bien là: Quand une page blanche s'affiche le lien marche parfaitement. Simplement votre feuille de style ne marche pas.

Je pense qu'on a un peu un dialogue de sourd pour XSLT. Si vous ne voulez pas faire comme je vous ai dit: une règle par élément XML, vous n'allez pas y arriver. Faut vraiment le faire et totalement ignorer le code que vous avez repris de votre livre. Pour utiliser le debugger il faut peut-être consulter l'aide. Le principe est simple: vous indiquez le fichier xml et le fichier xsl et cela montre comment le fichier xsl exécuté. Evidémment si votre fichier xsl ne fait rien, vous n'aurez pas grand chose comme résultat. Donc je répète encore une fois: Etudiez l'exemple recette. Ensuite vous faitez qc. d'étrange. Pourquoi dans votre rapport donner 2 fichiers avec un include. Un seul fichier .xsl suffit.

Re: Re: Re: Re: Re: Re: Re: Contribution wiki -- Nancy 18 mars 2011 à 19:25 (CET)

J'ai modifié le XSL selon vos consignes mais la page xml ne montre maintenant que le titre du livre et non la structure livre/titre, auteurs/auteur/nomPrenom, section/titre, chapitre/titre, paragraphe

=Re: Re: Re: Re: Re: Re: Re: Re: Contribution wiki -- Daniel K. Schneider 18 mars 2011 à 20:25 (CET)=

Pas tout à fait selon mes consignes, car vous utilisez toujours du value-of alors que vous n'en avez pas besoin. Enfin, l'approche est globalement bonne et vous êtes sur la bonne piste.

Problèmes XML

  • Vous ne validez pas votre DTD. Cela n'affecte pas Firefox, mais la note que vous allez avoir. Aussi, un éditeur XML va refuser de faire la transformation.

Problèmes XSLT:

  • Le XSLT n'est pas valide et sur la ligne 17 vous avez une erreur, un double >>. Là aussi donc, vous ne validez pas et c'est fatal.
  • <xsl:template match="Auteurs"> .... alors que cette balise n'existe pas (c'est auteurs pas Auteurs)
  • vous définissez deux fois un template pour livre ... le résultat est imprévisible..
  • Vos règles ne peuvent pas s'enchaîner. Vous oubliez xsl:apply-templates .... Regardez encore une fois les examples de près !!

Morale:

  • Utilisez un éditeur XML et validez chacun des trois fichiers... visiblement vous ne le faites pas
  • Regardez encore une fois les trois fichiers.
Re: Re: Re: Re: Re: Re: Re: Re: Re: Contribution wiki -- Nancy 18 mars 2011 à 23:22 (CET)

J'ai modifié le XSL par contre, je n'arrive pas à séparer les noms et prénoms des auteurs ainsi que de mettre un espace entre "deuxième paragraphe" et "chapitre 2". Je ne comprends pas pourquoi mon DTD n'est pas valide alors que j'y ai mis que des éléments mais plus d'attributs.

=Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Contribution wiki -- Daniel K. Schneider 19 mars 2011 à 01:43 (CET)=

Il vous manque des règles XSLT pour certains éléments, par exemple pour nom. Faut vraiment faire une règle pour chaque élément. Ensuite dans la règle faut insérer le HTML qui sépare selon ce que vous voulez obtenir. Facile, si vous voulez juste une virgule, difficile si vous voulez un blanc.

Insérer le nom en gras + une virgule:

<xsl:template match="nom">
<b><xsl:apply-templates/></b>, 
</xsl:template>

ou encore juste mettre un blanc

<xsl:template match="nom"> 
 <xsl:apply-templates/>  <xsl:text> </xsl:text>
</xsl:template>

Ceci dit, dans ce cas vous auriez pu utiliser la construction value-of dans la règle pour "auteur", mais je préfère la solution avec une règle par élément. C'est juste que certains informaticiens (par ex. ceux des sites que vous consultez qui ne comprennent pas trop comment XSLT a été conçu et ils essayent de retrouver ce qu'il comprennent eux.

Pour la DTD, vous respectez pas la syntaxe et cela n'a rien à voir avec les attributs. Entre (), Je vous ai dit de ne pas mettre des attributs pour que fassiez simple au lieu de compliqué.

Donc:

Faux:

<!ELEMENT livre titre, (auteurs, sections)+ >

Juste:

<!ELEMENT livre (titre, auteurs, sections)+ >
 ou plutôt si j'ai bien compris vos intentions
<!ELEMENT livre (titre, (auteurs, sections)+ ) >

etc. (vous avez pleins d'erreurs de ce type il me semble)

Autrement dit, comme je l'ai déja indiqué, il faut également valider la DTD. La plupart des éditeur XML le font (en tout cas celui que je conseille) Menu Schema->Validate DTD.

==Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Contribution wiki -- Nancy 19 mars 2011 à 18:13 (CET)==

Merci bien pour le corrigé de mes scripts. J'ai corrigé la DTD ainsi que le XSL. J'ai pu valider la DTD dans Exchanger XML Editor.

===Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Contribution wiki -- Daniel K. Schneider 20 mars 2011 à 13:27 (CET)===

ok. la prochaine fois, demandez mon conseil avant d'utiliser des ressources qui font compliqué ....

Si vous voulez encore améliorer le travail, faites une fichier XML qui a des vrais contenus. Sinon, je vous pas pourquoi vous avez 4 sortes de titres différents (enfin laissez cela sinon vous risquez de casser ... !!)