簡體   English   中英

將setParameter與節點集一起使用時,會引發異常“從java.lang.String到節點集的無效轉換”

[英]When using setParameter with a node-set, it raises exception “Invalid conversion from java.lang.String to node-set”

我試圖通過從我的java代碼調用XSLT來轉換XML。 我在將XML字符串作為參數傳遞給XSLT時遇到了問題。 這會導致異常:從“java.lang.String”到“node-set”的轉換無效。

這是調用XSLT的方法:

Transformer l_transformer
=TransformerFactory.newInstance().newTransformer(xslt_file_path);
l_transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
l_transformer.setParameter("collateralDoc", param_xmlString);

StringWriter l_writer = new StringWriter();
StringReader l_reader = new StringReader(inputXML);

Source l_in = new StreamSource(l_reader);
Result l_out = new StreamResult(l_writer);

l_transformer.transform(l_in, l_out);

在搜索了一些解決方案之后,我甚至嘗試從param XML字符串創建一個Document對象,並將Document對象傳遞給setParameter對象。 然后我得到了這個例外:

從'com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl'到'node-set'的轉換無效。

處理此輸入XML參數的XSLT代碼和拋出異常的行: <xsl:variable name="infoList" select="$paramXML/a/b"/>

我需要作為參數傳遞的參數XML如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
    <b>
        <c>
            <d>blah</d>
            <e>blah</e>
        </c>
        <f>
            <g>blah</g>
            <h>blah</h>
        </f>
    </b>
</a>

請幫我解決這個問題。

這是一個老問題,但我認為它仍然值得回答。

JDK的默認實現使用Xalan-J。 早在2005年, Jira針對Xalan 2.7提出了一個問題 ,要求支持傳遞節點或文檔對象。 在過去的10年中,這個問題尚未得到解決,盡管評論表明它“很容易做到”。

但是,上述問題表明可以傳遞DOM樹。 事實上,以下似乎有效:

String doc = "<root>Hello world!</root>";
transformer.setParameter("mydoc", new StreamSource(new StringReader(doc)));

如果出於某種原因你無法切換到更強大的XSLT處理器,比如Saxon,你也可以考慮另一種相對簡單的解決方法 ,我引用:

一種解決方法是使用樣式表中的文檔函數和您選擇的URI。 然后在Transformer上安裝URIResolver 應該實現URIResolver.resolve方法來查找該URI並返回一個類似於上面描述的DOMSource

此外,可以覆蓋setParameter方法以使用URIResolver注冊Node以使其正確使用。

關於同一主題的SO的答案中給出了一些替代解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM