2011-03-29 57 views
8

我想用Java中的XSLT轉換XML。爲此,我使用javax.xml.transform包。但是,我得到例外javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet。這是我正在使用的代碼:Java變壓器錯誤:無法編譯樣式表

public static String transform(String XML, String XSLTRule) throws TransformerException { 

    Source xmlInput = new StreamSource(XML); 
    Source xslInput = new StreamSource(XSLTRule); 

    TransformerFactory tFactory = TransformerFactory.newInstance(); 
    Transformer transformer = tFactory.newTransformer(xslInput); // this is the line that throws the exception 

    Result result = new StreamResult(); 
    transformer.transform(xmlInput, result); 

    return result.toString(); 
} 

請注意,我標記了引發異常的行。

當我輸入方法中,XSLTRule值是這樣的:

<xsl:stylesheet version='1.0' 
xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
xmlns:msxsl='urn:schemas-microsoft-com:xslt' 
exclude-result-prefixes='msxsl' 
xmlns:ns='http://www.ibm.com/wsla'> 
    <xsl:strip-space elements='*'/> 
    <xsl:output method='xml' indent='yes'/> 
    <xsl:template match='@* | node()'> 
     <xsl:copy> 
      <xsl:apply-templates select='@* | node()'/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/ns:SLA 
          /ns:ServiceDefinition 
           /ns:WSDLSOAPOperation 
            /ns:SLAParameter[@name='Performance']"/> 
</xsl:stylesheet> 
+0

你抓到了什麼異常? – 2011-03-29 12:28:22

+0

它是'javax.xml.transform.TransformerConfigurationException'。我編輯了我原來的帖子,現在在那裏。 – Ivan 2011-03-29 12:36:54

+0

爲什麼你的最後一個模板是空的? – Stephan 2011-03-29 12:41:01

回答

9

constructor

public StreamSource(String systemId) 

從URL構造一個StreamSource的。我想你會傳遞XSLT的內容。試試這個:

File xslFile = new File("path/to/your/xslt"); 
TransformerFactory factory = TransformerFactory.newInstance(); 
Templates xsl = factory.newTemplates(new StreamSource(xslFile)); 

您還必須設置OutputStreamStreamResult將寫入:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
Result result = new StreamResult(baos); 
transformer.transform(xmlInput, result); 
return baos.toString(); 
+3

或者,只需將'新的StreamSource(XSLTRule)'更改爲'新的StreamSource(新的StringReader(XSLTRule))' – 2011-03-29 13:09:06

+0

非常感謝!但是我仍然遇到'Result result = new StreamResult();'的問題。那裏做什麼? – Ivan 2011-03-29 13:11:33

+0

@Ivan:你遇到什麼問題?Result result = new StreamResult();'? – MarcoS 2011-03-29 13:19:05

1

你必須從你的XSLT串contruct流,然後用它作爲流源

InputStream xslStream = new ByteArrayInputStream(XSLTRule.getBytes("UTF-8")); 
Source xslInput = new StreamSource(xslStream); 

要得到的結果爲字符串:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    Result result = new StreamResult(bos); 
    transformer.transform(xmlInput, result); 
    String s = new String(bos.toByteArray()); 
    System.out.println(s); 
+0

非常感謝!但是我仍然遇到'Result result = new StreamResult();'的問題。那裏做什麼? – Ivan 2011-03-29 13:11:11

+0

我已將該代碼添加到答案中。 – Nishan 2011-03-29 13:50:45

0

要使用XSLTC,請在您的類路徑中放入xalan.jar(2.5),serializer.jar,xml-apis.jar和xercesImpl.jar。

+0

不要這樣做。所有這些軟件包(來自Xerces項目)自2010年以來一直被放棄。現在,代碼生活在JVM中。 – Lambart 2018-01-02 20:53:22