Je me suis battu avec cela depuis un certain temps, et je n'ai pas encore été en mesure de trouver une réponse claire à cela.
Si je comprends bien, je peux stocker des données dans un fichier XML, validez-le à l'aide d'un fichier XML. XSD, puis afficher les données soigneusement à l'aide d'un XSLT. P>
Cependant, j'ai eu des problèmes d'essayer d'exécuter des requêtes XPath pour sélectionner les données que je souhaite afficher dans mon XSLT. Lorsque j'utilise des sélecteurs génériques tels que ".// 'ou" * ", je reçois les résultats que je m'attends. Cependant, lorsque j'essaie d'utiliser des sélecteurs plus spécifiques tels que: «racine / réponses» ou toute autre variante de celle-ci, je ne reçois aucun résultat. P>
Le fichier XML est validé correctement par le XSD, donc je suppose que mes données sont au moins un peu correct. Lorsque je supprimai la référence XSD dans le fichier XML, supprimez efficacement la validation de données, mes requêtes de XPath fonctionnent soudainement! Y a-t-il quelque chose qui me manque? J'ai essayé d'ajouter des références d'espace de noms à la XSLT, mais à rien en vain. P>
J'ai décrit le XSD, l'échantillon XL et l'échantillon XSLT ci-dessous. Toute aide ou conseil serait appréciée! P>
Le XSD, définissant la structure, est comme suit. Ce XSD décrit un document simple, qui nie trois éléments et applique une contrainte; Le code du code des réponses doit être unique. P>
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html><body><h2>Responses</h2> <xsl:for-each select="root/responses/response"> <xsl:choose> <xsl:when test="description != ''"> <br/>'''<description> <br/>'''<xsl:value-of select="description" /> <br/>'''</description> </xsl:when> </xsl:choose> <br/> <xsl:value-of select="@code" /> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
3 Réponses :
Et bien sûr dès que vous postez une question, vous trouvez une réponse vous-même!
Il s'avère qu'il y a eu une faute de frappe dans la référence d'espace de noms. Après double vérification, ce post: p>
Espaces de noms XSLT-Transform-XML p>
qui s'avère essentiellement la même question. (J'ai cherché avant de poster .... honnête!), J'ai essayé d'ajouter une référence d'espace de noms à nouveau, et cette fois, cela fonctionnait parfaitement! P>
J'ai mappé l'espace de noms au préfixe 'NSM' (nomsPaMapping) et voilà ¡! P>
Haha! Vous m'avez battu quelques secondes avec votre propre réponse. Joli!
Bon travail trouvant la réponse seul. +1
C'est un problème d'espace de noms. Vous devrez ajouter une déclaration d'espace de noms pour notez le "XMLNS: test" dans les attributs http://foo.bar/responsecode.xsd code> et voir éléments à l'aide de cet espace de noms. Plus d'informations sont disponibles ici . < P> Donc, fondamentalement, vous aurez besoin de quelque chose comme ceci: p>
XSL: STATYLESHEET CODE> S. J'ai donné cela un test et ça marche. P> p>
Problème simple: vos éléments XML sont dans un espace de noms que votre XSLT ne connaît rien.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://foo.bar/responsecode.xsd" exclude-result-prefixes="foo" > <xsl:template match="/"> <html> <body> <h2>Responses</h2> <xsl:for-each select="foo:root/foo:responses/foo:response"> <!-- ... --> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>