2016-03-07 58 views
2
public class MultiXslt 
{ 
    public static void main(String[] args) throws TransformerException,ParserConfigurationException, SAXException, IOException 
    { 
     //source xslt 
     StreamSource stylesource = new StreamSource("C:/Users/santhanamk/Desktop/newxslt/Xslt inputs/Idml0.xsl"); 

     DocumentBuilderFactory docbFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder dBuilder = docbFactory.newDocumentBuilder(); 

     //source XML 
     Document sourceDoc = dBuilder.parse("C:/Users/santhanamk/Desktop/newxslt/input.xml"); 

     DOMSource source = new DOMSource(sourceDoc); 

     TransformerFactory transformerFactory = TransformerFactory 
       .newInstance(); 
     Transformer transformer = transformerFactory 
       .newTransformer(stylesource); 

     Document document = dBuilder.newDocument(); 
     DOMResult result = new DOMResult(document); 

     transformer.transform(source, result); 

     Node resultDoc = ((Document) result.getNode()).getDocumentElement(); 

     System.out.println(resultDoc.getChildNodes().getLength()); 

     // print the result 
     StringWriter writer = new StringWriter(); 
     Transformer transformer2 = transformerFactory.newTransformer(); 
     transformer2.transform(new DOMSource(resultDoc), new StreamResult(writer)); 
     String s = writer.toString();  

    } 
} 

其實我有一個xml文件和多個xsl文件(C:/ Users/santhanamk/Desktop/newxslt/Xslt輸入/ xsl列表)。當我將xml和xsl0作爲輸入時,我需要將輸出作爲字符串。所以在得到輸出後,我需要給出與xsl1的輸入字符串相同的輸出以獲得另一個輸出(字符串)。然後我需要將輸出作爲xsl2的輸入字符串來獲得另一個輸出。當給定的源目錄(C:/ Users/santhanamk/Desktop/newxslt/Xslt輸入/ xsl列表)有任何新的xsl文件來加載輸出字符串時,它應該給出最終輸出爲xml。如何用多個輸入的任何循環指定輸入目錄?

+0

所以你的問題是,你如何循環你的輸入xlst文件? – Rhayene

+0

如果您有XSLT樣式表的目錄,那麼您如何確定要應用的樣式表的順序? –

+0

實際上,我有很多名爲idml0,idml1,idml2,idml3 ..... idml16和單個xml(input.xml)的xsl文件。 – santhanam

回答

2

我認爲,如果您想進行鏈式轉換,那麼使用JAXP轉換API,那麼http://docs.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT8.html就有一個例子,使用XMLFilter創建SAXTransformerFactory.newXMLFilter

下面是一個示例Java代碼示出了如何使用樣式表文件名稱的數組和設置的過濾器鏈:

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParserFactory; 
import javax.xml.transform.Result; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerConfigurationException; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.sax.SAXSource; 
import javax.xml.transform.sax.SAXTransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLFilter; 
import org.xml.sax.XMLReader; 


public class JAXPTransChain1 { 


    public static void main(String[] args) throws FileNotFoundException, SAXException, ParserConfigurationException, TransformerException { 
     String[] stylesheets = new String[] {"sheet1.xsl", "sheet2.xsl", "sheet3.xsl"}; 
     String inputDoc = "input1.xml"; 
     chainSheets(stylesheets, inputDoc, new StreamResult(System.out)); 
    } 

    private static void chainSheets(String[] stylesheets, String inputDoc, Result result) throws FileNotFoundException, ParserConfigurationException, SAXException, TransformerConfigurationException, TransformerException { 
     InputSource input = new InputSource(new FileInputStream(inputDoc)); 

     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     spf.setNamespaceAware(true); 
     XMLReader reader = spf.newSAXParser().getXMLReader(); 

     SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance(); 

     XMLReader parent = reader; 

     for (int i = 0; i < stylesheets.length; i++) 
     { 
      String sheetUri = stylesheets[i]; 
      XMLFilter sheetFilter = stf.newXMLFilter(new StreamSource(new FileInputStream(sheetUri))); 
      sheetFilter.setParent(parent); 
      parent = sheetFilter; 
     } 

     Transformer proc = stf.newTransformer(); 

     SAXSource transSource = new SAXSource(parent, input); 

     proc.transform(transSource, result); 

    } 

} 

如果輸入是像

<root> 
    <foo>bar</foo> 
</root> 

樣品和樣式表做的例如

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/node()[last()]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
     <xsl:comment>sheet 1</xsl:comment> 
    </xsl:template> 

</xsl:stylesheet> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/node()[last()]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
     <xsl:comment>sheet 2</xsl:comment> 
    </xsl:template> 

</xsl:stylesheet> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/node()[last()]"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
     <xsl:comment>sheet 3</xsl:comment> 
    </xsl:template> 

</xsl:stylesheet> 

那麼最終的輸出是

<?xml version="1.0" encoding="UTF-8"?><root> 
    <foo>bar</foo> 
</root><!--sheet 1--><!--sheet 2--><!--sheet 3--> 

所以樣式表已經全部在輸入數組的順序應用。一旦你知道了你想要的順序,從目錄中的文件列表中設置這樣一個數組應該很容易。