我想使用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-->
因此样式表全部按照输入数组的顺序应用。一旦知道所需顺序,就很容易从目录中的文件列表中建立这样的数组。



