2012-07-31 85 views
0

我想獲取多個輸入文件(XML/HTML/XHTML)和相應的XSLT,以生成相應輸入文件的輸出文件。如果只有一個輸入XML文件和一個輸入XSLT文件,則可以從以下程序中成功轉換它。 E.g在給定程序中,我的輸入(X)HTML文件是temp.html,輸入XSLT是temp.xsl,它將輸出生成爲temp_copy.html。 如果我有兩個或兩個以上的輸入文件temp1.html和temp2.​​html以及相應的XSLT temp1.xsl和temp2.​​xsl,那麼最好的方法是什麼?那麼如何通過使用以下代碼生成輸出temp1_copy.html和temp2_copy.html?相應的輸入文件? 感謝你!使用Java程序用XSLT轉換多個XML/XHTML/HTML文件

我目前的Java代碼:

public class SimpleXSLT { 
    public static void main(String[] args) { 

     String inXML = "C:/tmp/temp.html"; 
     String inXSL = "C:/tmp/temp.xsl"; 
     String outTXT = "C:/tmp/temp_copy.html"; 
     SimpleXSLT st = new SimpleXSLT(); 
     try { 
      st.transform(inXML,inXSL,outTXT); 
      } catch(TransformerConfigurationException e) { 
      System.err.println("Invalid factory configuration"); 
      System.err.println(e); 
      } catch(TransformerException e) { 
      System.err.println("Error during transformation"); 
      System.err.println(e); 
     } 
    } 
    public void transform(String inXML,String inXSL,String outTXT) 
    throws TransformerConfigurationException, 
    TransformerException { 
     TransformerFactory factory = TransformerFactory.newInstance(); 
     StreamSource xslStream = new StreamSource(inXSL); 
     Transformer transformer = factory.newTransformer(xslStream); 
     transformer.setErrorListener(new MyErrorListener()); 
     StreamSource in = new StreamSource(inXML); 
     StreamResult out = new StreamResult(outTXT); 
     transformer.transform(in,out); 
     System.out.println("The generated XML file is:" + outTXT); 
    } 
} 
class MyErrorListener implements ErrorListener { 
    public void warning(TransformerException e) 
    throws TransformerException { 
     show("Warning",e); 
     throw(e); 
    } 
    public void error(TransformerException e) 
    throws TransformerException { 
     show("Error",e); 
     throw(e); 
    } 
    public void fatalError(TransformerException e) 
    throws TransformerException { 
     show("Fatal Error",e); 
     throw(e); 
    } 
    private void show(String type,TransformerException e) { 
     System.out.println(type + ": " + e.getMessage()); 
     if(e.getLocationAsString() != null) 
     System.out.println(e.getLocationAsString()); 
    } 
} 
+0

這是嚴格的XSLT 1.0問題還是XSLT 2.0解決方案也可以接受? – 2012-08-01 01:27:13

+0

@DimitreNovatchev感謝您的回覆。那麼在我的XSLT文件聲明就像xsl:stylesheet version =「1.0」,所以我認爲它應該是XSLT 1.0,但是當我在一個文件中將它更改爲xsl:stylesheet version =「2.0」時,它沒有任何區別。我不太瞭解XSLT,因此我不確定XSLT 2.0是否可以工作,但如果可以的話,請向我提供解決方案,以便我可以嘗試。感謝您! – RahulD 2012-08-01 05:17:46

+0

@DimitreNovatchev此外,這個java程序可以與.xml文件完美協作,但是當涉及.html文件(XHTML)時,它會變得非常緩慢,有時甚至連接都會超時。 – RahulD 2012-08-01 05:20:26

回答

2

您正在使用JAXP轉換API,也被稱爲TrAX的,所以我們堅持這一點。如果您轉移到XSLT 2.0和Saxon,那麼使用Saxon的s9api API會更好,但只要您不需要高級2.0功能,Saxon也支持TrAX。

在TrAX中,表示「編譯」樣式表的對象是Templates對象。所以你使用TransformerFactory.newTemplates()來編譯你的樣式表,然後你可以反覆使用這個Templates對象來轉換多個源文檔。 Templates.newTransformer()爲您提供了一個可用於執行轉換的轉換器。事實上,您可以反覆使用變壓器(串聯但不是並聯)來執行多次變換,但我的建議是每次使用新的變壓器。重用模板就是您獲得性能優勢的地方; Templates對象也是線程安全的。

至於1.0與2.0。對於許多簡單的轉換而言,1.0是非常充分的,但是您很快就會發現自己正在做一些分組或字符串操作,這些操作在2.0中更容易完成。由於Java平臺(即Saxon)提供了廣泛使用的開源XSLT 2.0處理器,並且具有兼容的API,因此現在幾乎沒有理由使用XSLT 1.0。

很多人錯誤地認爲樣式表上的版本屬性以某種方式被用來選擇XSLT 1.0或2.0處理器。這通常不是這種情況(除了可能在一些IDE中,例如XML Spy)。而是在那裏通知處理器作者寫入的XSLT規範的版本。如果你說版本=「1.0」並選擇一個2.0處理器,那麼它將以一種「quirks」模式運行,試圖與XSLT 1.0最大程度地兼容,例如,即使在你添加兩個時也會使用浮點運算整數。相反,當你說版本=「2.0」並選擇一個1.0處理器時,處理器在遇到它不理解的語言結構時將嘗試採取回退操作,而不是拒絕這些作爲編譯時錯誤。

+0

感謝您的回覆。現在,我試着按照你的建議。 – RahulD 2012-08-03 20:32:19