STIC Discussion:STIC I - exercice 6 (Nestor-Pixel)
template xml
Ce chablon ne fonctionne pas (chez moi en tout cas) :
<?xml version="1.0"?> <?xml-stylesheet href="votre_style.xsl" type="text/xsl"?> <votre_racine xmlns="http://tecfa.unige.ch/perso/maltt/XXXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tecfa.unige.ch/perso/maltt/XXXX" votre_xsd.xsd" > <!-- ici le contenu --> </votre_racine>
Il y a déjà une erreur dans le xsi:schemaLocation. Ce n'est pas :
xsi:schemaLocation="http://tecfa.unige.ch/perso/maltt/XXXX" votre_xsd.xsd"
mais
xsi:schemaLocation="http://tecfa.unige.ch/perso/maltt/XXXX votre_xsd.xsd" (attention aux guillemets)
Ensuite la déclaration du namespace (xmlns) me renvoie une page grise quoi que je mette. J'ai résolu le problème en utilisant le template suivant :
<?xml version="1.0"?> <?xml-stylesheet href="votre_xsl.xsl" type="text/xsl"?> <votre_racine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="votre_xsd.xsd"> <!-- ici le contenu --> </votre_racine>
Mais je reste quand même intrigué de savoir pourquoi le chablon où on définit notre namespace ne marche pas... j'ai pourtant essayé de mettre toutes les possibilités comme ns :
http://tecfa.unige.ch/perso/maltt/schneib0 (la solution conseillée)
http://tecfa.unige.ch/etu-maltt/nestor/schneib0/ (la location de la racine des fichiers)
http://tecfa.unige.ch/etu-maltt/nestor/schneib0/stic/ex6/ (le dossier exact)
http://tecfa.unige.ch/ (le nom de domaine)
En fait ça m'étonne que cette ligne pose problème, je pensais qu'elle était là uniquement à titre informatif... quelques éclaircissements seraient les bienvenus :)
--Bertrand Schneider 29 octobre 2007 à 21:12 (CET)
Réponses (provisoires)
Effectivement, j'avais une erreur dans le template (un " en s'est glissé dedans). J'ai corrigé (merci) ceci:
xsi:schemaLocation="http://tecfa.unige.ch/perso/maltt/XXXX votre_xsd.xsd"
Ensuite: oui l'URL utilisé pour le namespace n'a aucune importance...
Votre problème vient du fait que votre XSD n'est pas valide. Il faut valider. Dans Exchanger, Menu Schema->Validate XML Schema (donc c'est une procédure spéciale pour valider !).
Dans l'exemple http://tecfa.unige.ch/etu-maltt/nestor/schneib0/stic/ex6/annuaire2.xsd:
- Il y a un > en trop à la ligne 6 ou 7
- Il manque la déclaration XML (<?xml version="1.0"?>
Votre solution adaptée ci-dessus ne peut pas non plus marcher avec le XSD que j'ai vu. En plus, il sera plus difficile de valider le XML par la suite.
- Finalement le codage dans le fichier XML ne semble pas être en UTF-8 (enfin ce n'est pas génant pour valider).
... Ceci dit, je ne sais pas si les fichiers déposés sont les bons (genre dans le XML, vous faites référence à un XSD qui n'existe pas dans le répertoire. Mais bon, je suis parti de là. En tout cas, ceci marche avec vos fichiers:
Le XSD (annuaire2.xsd ... donc faites attention aussi aux noms de vos fichiers)
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://tecfa.unige.ch/perso/maltt/schneib0" targetNamespace="http://tecfa.unige.ch/perso/maltt/schneib0" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
Le XML (annuaire2.xml)
<nestor xmlns="http://tecfa.unige.ch/perso/maltt/schneib0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tecfa.unige.ch/perso/maltt/schneib0 annuaire2.xsd" >
... après il y d'autres problèmes (liés à la construction du schéma, mais j'imagine que vous vous êtes arrété là ...)
Corrections
Effectivement, les fichiers sur le serveur n'étaient pas les plus récent, mais toutes vos remarques m'ont aidé. Pour la construction du schéma j'ai juste pris la version qu'Exchanger fournit après avoir converti la .dtd en .xsd . Je voulais la corriger plus tard en fonction des explications sur les pdf du cours.
A propos du symbole > en trop à la ligne 6 ou 7 du fichier .xsd, l'erreur vient du chablon que j'ai copié/collé sur le site du cours (par ailleurs, en corrigeant cela mon fichier xsd devient valide). En passant ça serait pratique de rajouter le <?xml version="1.0"?> dans le chablon, comme ça ça évitera que d'autres personnes oublient de le mettre dans leur .xsd :)
Merci pour toutes vos explications!
--Bertrand Schneider 29 octobre 2007 à 21:12 (CET)
Exercice 6
J'obtiens deux erreurs que je ne m'explique pas. Elles sont peut-être à l'origine de l'absence d'affichage de contenu pour mon fichier xml sur le serveur.
Première message d'erreur (fichier grilleTIC.xml) : "Non-whitespace characters are not allowed in schema elements other than 'xs:appinfo' and 'xs:documentation'. Saw 'attributeFormDefault="unqualified" '." Les numéros de ligne impliqués (7 et 8) ne contiennent pourtant plus de code après formattage de la page. J'ai le sentiment que l'éditeur ne digère pas la ligne suivante: xsi:schemaLocation="http://tecfa.unige.ch/perso/maltt/sutterw5 grilleTIC.xsd"
Deuxième message d'erreur (fichier grilleTIC.xsd): Ln 94 Col 15 - cvc-complex-type.2.3: Element 'xs:schema' cannot have character [children], because the type's content type is element-only." Ce message concerne la dernière ligne du code qui contient la balise suivante: </xs:schema> Il n’apparaît que lorsque je reprends les éléments de l’en-tête du template XSD du cours. Par contre, si je garde les éléments donnés par défaut lors de la traduction de la dtd en XSD par Exchanger XML editor, je n’obtiens pas ce message.
Mes fichiers sont accessibles à http://tecfa.unige.ch/etu-maltt/nestor/sutterw5/stic/ex6/
Denise Sutter Widmer - 2 novembre 2007
Réponse
Le valideur de Schema n'est pas content parceque vous avez sur la ligne 6 un ">" de trop FAUX:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tecfa.unige.ch/perso/maltt/sutterw5" xmlns="http://tecfa.unige.ch/perso/maltt/sutterw5" elementFormDefault="qualified"> <!-- ICI à gauche y a le > en trop ... --> attributeFormDefault="unqualified" version="1.0">
JUSTE:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tecfa.unige.ch/perso/maltt/sutterw5" xmlns="http://tecfa.unige.ch/perso/maltt/sutterw5" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
Morale: Faut tjrs valider le schéma:
- Menu Schema->Validate XML Schema
- Faut aussi regarder les couleurs ... la ligne 7 et 8 sont noirs ... donc pas pareils, donc faire attenion.
[Xerces-J 2.7.1] Validating XML Schema "grilleTIC.xsd" ... Ln 7 Col 39 - s4s-elt-character: Non-whitespace characters are not allowed in schema elements other than 'xs:appinfo' and 'xs:documentation'. Saw 'attributeFormDefault="unqualified" '. Ln 8 Col 18 - s4s-elt-character: Non-whitespace characters are not allowed in schema elements other than 'xs:appinfo' and 'xs:documentation'. Saw 'version="1.0">'. 2 Errors
.. puis aprèsc orrection c'est bon :)
Feuille de style
Merci d'avoir repéré cette erreur. Mes fichiers sont enfin valides. Comme j'ai fait un simple copier/coller depuis le template XSD que vous nous proposez dans la page STIC-ex: 6, il faudrait peut-être pour les autres étudiants corriger cette erreur qui figure dans le template.
Par contre, j'ai toujours un petit problème: la feuille de style (grilleTIC.xsl) associée au fichier xml n'est pas reconnu. Dans le navigateur Firefox cela donne, pour le fichier xml, une page grise sans contenu, et dans Internet Explorer le contenu est affiché mais sans mise en forme. J'ai modifié les élément de l'en-tête du fichier xsl en reprenant textuellement celles du template que vous fournissez, mais cela ne change rien. J'ai également jeté un coup d'oeil dans les exemples que vous nous donnez dans l'exercice 6 (http://tecfa.unige.ch/guides/xml/examples/xsd-examples/ ) mais il n'y a aucun exemple de fichier xml associé à une feuille de style xsl.
Question annexe de compréhension : Pourquoi, dans le fichier xsl, on peut avoir comme output method: "xml" (cf. l'exemple 1) ou comme output method: "html" (exemple 2, qui est celui que vous donnez comme template). Est-ce que cela fait une différence?
exemple 1) <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0"> <xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" indent="yes" encoding="iso-8859-1"/> exemple 2) <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/>
--Denise Sutter Widmer 4 novembre 2007 à 11:37 (CET)
XHTML vs. HTML
Un XHTML "pur" est du xml, donc il faut que la sortie soit en xml. La seule différence est au niveau des entêtes produits, puis ce processeur produit aussi des entités HTML pour les caractères (idiot). Sinon XSLT fonctionne exactement de la même manière. Donc il faut absolument utiliser une sortie xml si votre XHTML inclut d'autre vocabulaires (genre SVG), sinon vous pouvez choisir....
A relire peut-être: http://tecfa.unige.ch/guides/tie/html/xml-xslt/xml-xslt-6.html
Le problem XSLT
Cela concerne tout le monde !
Effectivement vous êtes tombée sur qc. auquel je n'ai pas pensé. Votre fichier XML contient des balises qui appartiennent à un namespace (http://tecfa.unige.ch/perso/maltt/sutterw5). Vos règles cherchent des balises sans namespace et n'en trouve pas. Donc il faut modifier soit le XSLT pour qu'il cherche dans votre namespace, soit modifier le XML pour qu'il n'y ait plus de namespace...
Solution 1:
- Déclarer un namespace avec préfixe dans le XSLT
- Ajouter une préfixe à toutes vos balises XML
- Dire à XSLT de ne pas pas garder ce namespace pour la sortie (enfin pas forcément obligatoire)
Donc pour votre exemple, j'ai ajouté la préfixe "tic:" (au hasard).
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tic="http://tecfa.unige.ch/perso/maltt/sutterw5" version="1.0" exclude-result-prefixes="tic" > <xsl:output method="html"/> <xsl:template match="tic:caracteristiques_TIC"> <html> <head> <title> <xsl:value-of select="tic:title"/> </title> </head> <body bgcolor="#8CA7FC"> <xsl:apply-templates/> </body> </html> </xsl:template> ..... <xsl:template match="tic:identité_logiciel"> <h4 align="left">Identité du logiciel</h4> <a href="{tic:adresse_URL}"> <xsl:value-of select="tic:nom_logiciel"/> </a> <xsl:apply-templates select="tic:éditeur"/> </xsl:template> ..... etc.
Solution 2:
Enlever l'association avec la XSD du fichier xml avant de le publier (donc après une validation "manuelle"
ça marche !
Merci pour les explications. J'ai choisi la solution 1. J'ai remarqué, par contre, qu'il ne faut pas utiliser de préfixe pour les attributs sinon ils ne sont pas reconnus. --Denise Sutter Widmer 4 novembre 2007 à 20:56 (CET)
- Oui juste. Vos attributs sont sans namespace. Bravo :) - Daniel K. Schneider 5 novembre 2007 à 15:59 (CET)
Question à propos du fichier xml
Tout d'abord merci pour tes questions Denise, car j'avais un peu laissé cet exercice de côté en obtenant le même fond gris que toi. A présent ça marche impeccablement :) J'aurais une questions à propos du fichier xml : est-ce qu'on peut reprendre exactement le même fichier que pour l'exercice deux?
-- Chantal t 4 décembre 2008 à 09:35 (CET)
Ex6: XML, XSD et XSLT Ma feuille de style "entrep.xsl" associée au fichier contact_entrep.xml n'est pas reconnue. Je ne comprends pas la réponse que vous avez donné à ce sujet dans les précédentes discussions. C'est quoi un "namespace"? A quoi correspond le préfixe "tic" dans ma page? Que dois-je enlever exactement ou ajouter pour que ça marche? Voici l'url qui mène à mes exercices: http://tecfa.unige.ch/etu-maltt/oda/tchoual3/stic/ex6 Merci pour votre réponse.
Chantal.
Quel template choisir? -- Sugarch0 17 novembre 2009 à 15:53 (CET)
Je traverse l'exercice 6 et suis bloquée au moment de modifier mon fichier XSLT: J'ai bien lu (plusieurs fois) les transparents mais je n'arrive pas à comprendre pourquoi il y a deux templates, ni lequel choisir.