2017-07-26 84 views
-1

當我從XML在Java中使用XSLT轉換爲JSON出現以下錯誤:出錯轉換XML來JSON

必需項類型FN的第一個參數的:XML到JSON()是節點();提供的值具有項目類型的xs:串

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> 

錯誤:

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

那麼,你如何傳遞參數?考慮簡單地傳遞XML作爲主要輸入文檔並使用例如''或者確保你傳入的參數不是但只有一個節點。或者,如果你有一個字符串參數,那麼你可以使用''。 –

+0

此外,您擁有的XML不是用於輸入到'xml-to-json'的模式的有效實例,我認爲,所以您需要首先將其轉換爲刪除'subject'內容或轉義它以確保'string key =「subjects」的內容是一個簡單的字符串。 –

+0

@MartinHonnen當我傳遞字符串作爲xml-to-json(parse-xml($ xmlText))時,它將拋出xml-to-json:在錯誤的命名空間中找到的元素:Q {} Event。 – bookofcodes

回答

0

我對這個問題投了反對票,因爲你顯然沒有足夠小心:錯誤信息指的是一個xsl:copy-of指令,它不在你向我們顯示的代碼中;而且您沒有向我們展示樣式表是如何調用的以及$xmlText的值是如何提供的。

但是(鞏固已經取得的在評論中建議),您需要:

(一)確保參數XML到JSON()是一個節點。如果您從URI開始,請調用doc()或document()函數來獲取節點。如果您從包含詞法XML的字符串開始,請調用parse-xml()函數。 (b)確保您傳遞的節點對規範中定義的架構(對於JSON的XML表示)有效。例如,此架構不允許subject作爲string的子項。 (我不知道你想在這裏達到什麼樣的輸出:如果你想在JSON輸出爲形式

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

,那麼你應該輸入改爲

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

(其它併發症出現如果有換行符,但這將是一個單獨的問題)。