2014-10-09 77 views
2

我想實現一個小例子,我想將文本文件中的內容轉換爲使用XSL作爲變換器的XML文件。我碰到過這個例子 - XSL - create well formed xml from text file在SO,我試圖實現相同的,但面臨一些問題。Java程序使用XSL將文本文件轉換爲XML

我正在使用與SO帖子中回答的輸入和XSL文件相同的文本文件。這是Java程序我想使用:

public class Parser { 
    public static void main(String[] args) { 
     String path="src/"; 
     String text = path+"input.txt"; 
     String xslt = path+"input.xsl"; 
     String output = path+"output.xml"; 

     System.setProperty("javax.xml.transform.TransformerFactory",  
       "net.sf.saxon.TransformerFactoryImpl"); 
     try { 
      TransformerFactory tf = TransformerFactory.newInstance(); 

      Transformer tr = tf.newTransformer(new StreamSource(xslt)); 
      tr.transform(new StreamSource(text), new StreamResult(
        new FileOutputStream(output))); 

      System.out.println("Output to " + output); 
     } catch (Exception e) { 
      System.out.println(e); 
      e.printStackTrace(); 
     } 
    } 
} 

我得到的例外是:

Error on line 1 column 1 of input.txt: 
    SXXP0003: Error reported by XML parser: Content is not allowed in prolog. 
net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException: Content is not allowed in prolog. 
net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException: Content is not allowed in prolog. 
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:418) 
    at net.sf.saxon.event.Sender.send(Sender.java:214) 
    at net.sf.saxon.event.Sender.send(Sender.java:50) 
    at net.sf.saxon.Controller.transform(Controller.java:1611) 
    at three.Parser.main(Parser.java:21) 
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388) 
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1036) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:404) 
    ... 4 more 

看來我不能使用文本文件作爲輸入在我的計劃。有人可以幫助我解決問題。

更新:

我已經使用Saxon S9 API(使用瓶 - saxon9he.jar)解決它由Martin在他的回答表明,這裏是工作的Java代碼。

import java.io.File; 

import javax.xml.transform.stream.StreamSource; 

import net.sf.saxon.s9api.Processor; 
import net.sf.saxon.s9api.QName; 
import net.sf.saxon.s9api.SaxonApiException; 
import net.sf.saxon.s9api.Serializer; 
import net.sf.saxon.s9api.XsltCompiler; 
import net.sf.saxon.s9api.XsltExecutable; 
import net.sf.saxon.s9api.XsltTransformer; 
public class Parser { 
    public static void main(String[] args) throws SaxonApiException { 
     Processor proc = new Processor(false); 
     XsltCompiler comp = proc.newXsltCompiler(); 
     XsltExecutable exp = comp.compile(new StreamSource(new File(
       "src/input.xsl"))); 
     Serializer out = new Serializer(); 
     out.setOutputProperty(Serializer.Property.METHOD, "xml"); 
     out.setOutputProperty(Serializer.Property.INDENT, "yes"); 
     out.setOutputFile(new File("src/output.xml")); 
     XsltTransformer trans = exp.load(); 
     trans.setInitialTemplate(new QName("main")); 
     trans.setDestination(out); 
     trans.transform(); 

     System.out.println("Output written to text file"); 
    } 
} 
+0

查看你引用它的SO引用,提到*必須將文本文件轉換爲平面XML文件*,然後才能將它提供給XSLT處理器。我認爲你到目前爲止跳過了這一步。您**不能**提供簡單的文本文件,因爲它通常不是有效的XML文件。 – 2014-10-09 12:24:01

+0

http://stackoverflow.com/questions/2310926/sxxp0003-error-reported-by-xml-parser-content-is-not-allowed-in-prolog – 2014-10-09 12:26:10

回答

2

代碼中的文本轉換文本XML取決於XSLT 2.0和XSLT 2.0處理器,如Saxon 9.您嘗試使用的JAXP API僅適用於使用XSLT 1.0方法將XML輸入文檔作爲XSLT代碼的主要來源。因此,如果您想使用該API,則需要確保將虛擬輸入XML傳遞給轉換器,而純文本文件的URI應作爲參數傳入。但是,我會建議使用Saxon S9 API來簡單地啓動帶有命名模板main的樣式表,同時也傳入純文本URI作爲參數。

+0

感謝Martin,我會檢查API並瞭解如何在獨立程序中實現它。 – Chaitanya 2014-10-09 12:34:35

+0

感謝Martin,我使用了API並創建了一個程序,我用工作程序更新了我的問題。 – Chaitanya 2014-10-09 12:57:39

1

您無法將純文本提供給XSL轉換器。它只接受格式良好的XML作爲輸入。

所以在鏈接的問題的代碼啓動變壓器無輸入,然後XSLT的內部,它加載與

<xsl:variable name="csv" select="unparsed-text($pathToCSV, $encoding)" /> 
+0

謝謝亞倫,但是當我運行命令提到的java -jar saxon9he.jar -it:main -xsl:sheet.xsl'的答案,我可以在控制檯中看到生成的xml。我試圖用獨立的java代碼實現同樣的事情,但是卡住了,怎麼做。 – Chaitanya 2014-10-09 12:32:54