2017-07-26 3 views
-1

Quand on me la conversion de XML en JSON utilisant XSLT en Java l'erreur suivante se produit:erreur lors de la conversion xml à json

type d'élément requis de premier argument de fn: xml-à-json() est noeud() La valeur fournie est du type d'élément xs: string

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<map xmlns="http://www.w3.org/2005/xpath-functions"> 
    <string key="student">john</string> 
    <string key="class">Bachelors</string> 
    <string key="subjects"> 
     <subject> 
      <subjects>maths</subjects> 
     </subject> 
    </string> 
</map> 

XSLT (XML à Json):

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:param name="xmlText"/> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template name="init"> 
    <xsl:apply-templates select="xml-to-json($xmlText)"/> 
    </xsl:template> 
</xsl:stylesheet> 

Erreur:

Type error at char 12 in xsl:copy-of/@select on line 30 column 50 of json2xml.xsl: 
    XPTY0004: Required item type of first argument of fn:xml-to-json() is node(); 
    supplied value has item type xs:string Exception in thread "main" net.sf.saxon.s9api.SaxonApiException: 
    Required item type of first argument of fn:xml-to-json() is node(); 
    supplied value has item type xs:string at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:599) 
    at com.xmltojson.sampleclass.SimpleJaxp.main(SimpleJaxp.java:44)Caused by: net.sf.saxon.trans.XPathException: 
    Required item type of first argument of fn:xml-to-json() is node(); 
    supplied value has item type xs:string 
+0

Eh bien, comment passez-vous dans ce paramètre? Pensez simplement à passer en XML comme document d'entrée principal et utilisez par exemple ''. Ou assurez-vous que le paramètre que vous passez n'est pas aussi tring mais un noeud. Comme alternative, si vous avez un paramètre de chaîne, vous pouvez utiliser ''. –

+0

En outre, le XML que vous avez n'est pas une instance valide du schéma pour l'entrée de 'xml-to-json' je pense, donc vous devrez le transformer d'abord pour supprimer le contenu' subject' ou l'échapper pour assurer la le contenu de 'string key =" sujets "' est une chaîne simple. –

+0

@MartinHonnen quand je passe une chaîne comme xml-to-json (parse-xml ($ xmlText)), elle lance xml-to-json: élément trouvé dans un mauvais espace de noms: Q {} Event. – bookofcodes

Répondre

0

J'ai décliné la question parce que vous n'y avez clairement pas prêté attention: le message d'erreur fait référence à une instruction xsl:copy-of qui n'est pas dans le code que vous nous avez montré; et vous ne nous avez pas montré comment la feuille de style est invoquée et comment la valeur de $xmlText est fournie.

Cependant (consolider ce qui a déjà été suggéré dans les commentaires), vous devez:

(a) veiller à ce que l'argument XML à JSON() est un nœud. Si vous démarrez à partir d'un URI, appelez la fonction doc() ou document() pour obtenir un nœud. Si vous partez d'une chaîne contenant du XML lexical, appelez la fonction parse-xml(). (B) s'assurer que le nœud que vous transmettez est valide par rapport au schéma (pour la représentation XML de JSON) défini dans la spécification. Par exemple, ce schéma n'autorise pas subject en tant qu'enfant de string. (Je ne suis pas sûr de ce que la sortie que vous voulez réaliser ici: si vous voulez que la sortie JSON soit sous la forme

"subjects": "<subject><subjects>maths</subjects></subject>" 

alors vous devriez changer l'entrée

<string key="subjects"><![CDATA[<subject><subjects>maths</subjects></subject>]]></string> 

(autres complications surviennent s'il ya des sauts de ligne présents, mais ce serait une question distincte.)