2017-07-31 1 views
0

J'essaie d'utiliser XSL pour transformer deux fichiers XML en HTML. J'ai tout fonctionne, mais j'ai un problème. Un des fichiers XML contient des informations variées que je tire de. Il n'y a aucune déclaration d'espace de noms dans le fichier, mais les nœuds auxquels j'ai besoin d'accéder sont préfixés par l'espace de noms. Mon correctif d'origine consistait à ajouter les espaces de noms au nœud racine, mais j'ai découvert que je ne pouvais pas le faire car les fichiers ne pouvaient pas être modifiés.Importer XML dans XSL qui n'a pas d'espace de noms sur le nœud racine

Si je quitte les namespaces off, je reçois le texte suivant dans Firefox:

XML Parsing Error: prefix not bound to a namespace 

Les espaces de noms doivent être (mais n'existent pas dans le fichier XML source):

xmlns:prop="http://www.blank.com/prop" 
xmlns:item="http://www.blank.com/item" 

Comment faire Je résous ça?

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<collection> 
    <prop:id>123</prop:id> 
    <document> 
    <item:name>Document</item:name> 
    </document> 
</collection> 

XSL: (ni de la valeur des éléments de travail)

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html"/> 
    <xsl:variable name="propsPath" select="test_Props.xml"/> 
    <xsl:variable name="props" select="document($propsPath)" /> 

    <xsl:template match="/"> 
    <html><body><div> 
     <xsl:value-of select="$props/collection/*[local-name() = 'id']"/> 
     <xsl:value-of select="$props/collection/prop:id"/> 
    </div></body></html> 
    </xsl:template> 
</xsl:stylesheet> 
+1

Si votre entrée utilise des préfixes sans les lier à un espace de noms, ce n'est pas un document XML bien formé et ne peut pas être traité par XSLT. –

Répondre

1

EDIT: Ce post ne résout pas la question spécifique. Néanmoins, je le laisse ici, car il illustre une solution au problème général.

Une solution que j'ai trouvée pour contourner le problème d'espace de noms sans modifier test_Props.xml utilise une référence d'entité dans un fichier de raccord.

donc votre fichier test_Props.xml est ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<collection> 
    <prop:id>123</prop:id> 
    <document> 
    <item:name>Document</item:name> 
    </document> 
</collection> 

Maintenant, créez un fichier stub autour de ce contenu nommé test_Props_stub.xml:

<?xml version="1.0"?> 
<!DOCTYPE doc [ 
<!ENTITY otherFile SYSTEM "test_Props.xml"> 
]> 
<root xmlns:prop="http://www.blank.com/prop" xmlns:item="http://www.blank.com/item"> 
&otherFile; 
</root> 

Cette solution est inspirée par this SO answer.
Ensuite, il suffit de modifier le nom du document et son chemin dans votre XSLT en ajoutant le nouveau nœud racine et vous avez terminé:

<xsl:variable name="propsPath" select="'test_Props_stub.xml'"/> 
<xsl:variable name="props" select="document($propsPath)/root" /> 

Le reste peut rester unmodifyed.
Maintenant, les espaces de noms du noeud root du fichier de raccord sont appliqués au fichier XML d'origine et les expressions XPath correspondent à.


BTW vous avez eu un bug mineur mais méchant dans la ligne suivante:

<xsl:variable name="propsPath" select="test_Props.xml"/> 

Vous avez oublié les guillemets autour du nom de fichier.

+0

ne fonctionne malheureusement pas avec Firefox. J'aurais dû dire que j'ai essayé ça. Je m'excuse. –