我認爲,如果您想進行鏈式轉換,那麼使用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-->
所以樣式表已經全部在輸入數組的順序應用。一旦你知道了你想要的順序,從目錄中的文件列表中設置這樣一個數組應該很容易。
所以你的問題是,你如何循環你的輸入xlst文件? – Rhayene
如果您有XSLT樣式表的目錄,那麼您如何確定要應用的樣式表的順序? –
實際上,我有很多名爲idml0,idml1,idml2,idml3 ..... idml16和單個xml(input.xml)的xsl文件。 – santhanam