JAVAでスタイルシート付きXMLを生成する

スタイルシート付きXMLJavaでの生成の方法をメモ


出力したい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>


XMLを生成するJavaです。
Sample.java

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));
  }
}


標準出力されたXMLUTF-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>