JAVAでスタイルシート付きXMLを生成する
出力したいXMLは以下
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="style.xsl"?> <Sample> <items> <item> <title>タイトル0</title> <content>コンテンツ0</content> </item> <item> <title>タイトル1</title> <content>コンテンツ1</content> </item> </items> </Sample>
import java.io.OutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.ProcessingInstruction; public class Sample { public static void main(String[] args) { Sample sample = new Sample(); try { Document document = sample.getDocument(); // スタイルシート追加 ProcessingInstruction pi = document.createProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"style.xsl\""); document.appendChild(pi); Element root = document.createElement("Sample"); Element items = sample.getItems(document); root.appendChild(items); document.appendChild(root); sample.write(document, System.out); } catch( Exception e ) { e.printStackTrace(); } } /** * 新しい {@link Document} インスタンスを取得します。<br> * * @return {@link Document} * @throws ParserConfigurationException */ public Document getDocument() throws ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); return builder.newDocument(); } /** * items要素を生成し、取得します。<br> * * @param document {@link Document} * @return items要素 */ public Element getItems(Document document) { Element items = document.createElement("items"); for( int i = 0; i < 2; i++ ) { Element item = document.createElement("item"); Element title = document.createElement("title"); title.appendChild(document.createTextNode("タイトル" + i)); item.appendChild(title); Element content = document.createElement("content"); content.appendChild(document.createTextNode("コンテンツ" + i)); item.appendChild(content); items.appendChild(item); } return items; } /** * writerに生成したXMLを出力します。<br> * * @param document {@link Document} * @param os {@link OutputStream} * @throws ParserConfigurationException * @throws TransformerException */ public void write(Document document, OutputStream os) throws ParserConfigurationException, TransformerException { TransformerFactory factory = TransformerFactory.newInstance(); Transformer transfor = factory.newTransformer(); transfor.transform(new DOMSource(document), new StreamResult(os)); } }
標準出力されたXMLをUTF-8で保存してブラウザで見るとXMLではなく、xslで記述したHTMLで見えます。
補足としてstyle.xslはこんな感じ
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dc="http://purl.org/dc/elements/1.1/"> <xsl:output method="html" encoding="UTF-8" /> <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="Sample"> <html> <head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8" /> <title>スタイルシート付きXMLの生成</title> </head> <body> <h1>スタイルシート付きXMLの生成</h1> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="items"> <xsl:for-each select="item"> <div class="item"> <h2><xsl:value-of select="title" /></h2> <p><xsl:value-of select="content" /></p> </div> </xsl:for-each> </xsl:template> </xsl:stylesheet>