package jaxp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Templates; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.DTDHandler; import org.xml.sax.EntityResolver; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.AttributesImpl; public class SAX_XSL { public static void main(String[] args) throws Exception{ transform_by_saxsource(); transform_by_saxtransformfactory(); } private static void transform_by_saxtransformfactory() throws TransformerFactoryConfigurationError, TransformerConfigurationException, IOException, SAXException { TransformerFactory factory = TransformerFactory.newInstance(); if(factory.getFeature(SAXTransformerFactory.FEATURE)){ SAXTransformerFactory saxfactory = (SAXTransformerFactory) factory; TransformerHandler handler = saxfactory.newTransformerHandler(new StreamSource(loadxsl())); handler.setResult(new StreamResult(System.out)); CSVParser parser = new CSVParser(); parser.setContentHandler(handler); System.out.println("//------------华丽的分割线----------------//"); parser.parse(new InputSource(loadcsv())); } } private static void transform_by_saxsource() throws TransformerFactoryConfigurationError, TransformerConfigurationException, TransformerException { TransformerFactory factory = TransformerFactory.newInstance(); Templates templates= factory.newTemplates(new StreamSource(loadxsl())); Transformer transformer = templates.newTransformer(); Source source = new SAXSource(new CSVParser(),new InputSource(loadcsv())); Result result = new StreamResult(System.out); transformer.transform(source, result); } private static InputStream loadxsl() { InputStream xsl = SAX_XSL.class.getClassLoader().getResourceAsStream("jaxp/csv.xsl"); return xsl; } private static InputStream loadcsv() { InputStream xsl = SAX_XSL.class.getClassLoader().getResourceAsStream("jaxp/book.csv"); return xsl; } public static class CSVParser implements XMLReader { private static final Attributes EMPTY_ATTRS = new AttributesImpl(); private static final String HTTP_XML_ORG_SAX_FEATURES_NAMESPACES="http://xml.org/sax/features/namespaces"; private ContentHandler contentHandler; private DTDHandler dtdHandler; private EntityResolver entityResolver; private ErrorHandler errorhandler; private Map featureMap = new HashMap(); private Map propertyMap = new HashMap(); public CSVParser() { featureMap.put(HTTP_XML_ORG_SAX_FEATURES_NAMESPACES, new Boolean(true)); } public ContentHandler getContentHandler() { return this.contentHandler; } public void setContentHandler(ContentHandler contenthandler) { this.contentHandler = contenthandler; } public DTDHandler getDTDHandler() { return this.getDTDHandler(); } public void setDTDHandler(DTDHandler dtdhandler) { this.dtdHandler = dtdhandler; } public EntityResolver getEntityResolver() { return this.entityResolver; } public void setEntityResolver(EntityResolver entityresolver) { this.entityResolver = entityresolver; } public ErrorHandler getErrorHandler() { return this.errorhandler; } public void setErrorHandler(ErrorHandler errorhandler) { this.errorhandler = errorhandler; } public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { Boolean value = (Boolean) featureMap.get(name); if(value == null){ return false; } return value.booleanValue(); } public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException { this.featureMap.put(name, new Boolean(value)); } public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException { propertyMap.put(name, value); } public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { return propertyMap.get(name); } public void parse(String systemId) throws IOException, SAXException { parse(new InputSource(systemId)); } private boolean requiredNameSpace() throws SAXException { return getFeature(HTTP_XML_ORG_SAX_FEATURES_NAMESPACES); } public void parse(InputSource inputsource) throws IOException, SAXException { ContentHandler handler = getContentHandler(); if(handler == null){ return; } BufferedReader reader = null; if(inputsource.getCharacterStream()!=null){ reader = new BufferedReader(inputsource.getCharacterStream()); } else if (inputsource.getByteStream()!=null){ reader = new BufferedReader(new InputStreamReader(inputsource.getByteStream())); } else if (inputsource.getSystemId() !=null && inputsource.getSystemId().trim().length()>0){ URL url = new URL(inputsource.getSystemId()); reader = new BufferedReader(new InputStreamReader(url.openStream())); } if(reader == null){ throw new SAXException("invalid inputsource object"); } handler.startDocument(); if(requiredNameSpace()){ handler.startElement("", "books", "books", EMPTY_ATTRS); } else { handler.startElement("", "", "books", EMPTY_ATTRS); } String line = null; while((line = reader.readLine())!=null){ handler.startElement("", "book", "book", EMPTY_ATTRS); String[] values = line.split(","); if(values!=null && values.length>0){ handler.startElement("", "name", "name", EMPTY_ATTRS); handler.characters(values[0].toCharArray(), 0, values[0].length()); handler.endElement("", "name", "name"); if(values.length>=2){ handler.startElement("", "authors", "authors", EMPTY_ATTRS); handler.startElement("", "author", "author", EMPTY_ATTRS); handler.characters(values[1].toCharArray(), 0, values[1].length()); handler.endElement("", "author", "author"); handler.endElement("", "authors", "authors"); } } handler.endElement("", "book", "book"); } if(requiredNameSpace()){ handler.endElement("", "books", "books"); } else { handler.endElement("", "", "books"); } handler.endDocument(); } } }
book.csv:
java & xml,dava java xslt,martin hibernate in action,gavin king spring in action,test
csv.xsl:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head> <title>books</title> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="books"> <table border="1"> <tr> <td>no</td> <td>book name</td> <td>authors</td> </tr> <xsl:apply-templates select="book"> <xsl:sort order="desending" data-type="text" select="name"/> </xsl:apply-templates> </table> </xsl:template> <xsl:template match="book"> <tr> <td><xsl:value-of select="position()"/></td> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="authors"/></td> </tr> </xsl:template> </xsl:stylesheet>