Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

XSLTを使用したメールテンプレートの作り方

定型的なメールをXSLTでレイアウトする

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/07/05 14:00

メール配信機能を実装する際にテンプレートにXSLTを使用することで柔軟にレイアウト変更を行うことができます。

目次

はじめに

 メール配信機能を実装する場合にレイアウトが結構面倒だったりしませんか?

 プログラムに直に書く場合もあるかもしれませんし、Velocityエンジンなどを使用する場合もあるかもしれません。ここではXSLTを使用してメールテンプレートを実装します。言語に関わらず使用でき、レイアウト変更が比較的簡単に行うことができます。

対象読者

  • メール配信機能を実装できる人。
  • Javaによるサンプルですが他の言語でも流用できます。

Javaによるサンプルデータの実装

 メール本文を生成するプログラムのメソッド部分です。実際にはメール配信を行う部分の実装も必要ですが、対象読者はメール配信機能を実装できる人としているため、割愛しています。また本来ならメソッドを細かく分けるべきですが、サンプルのため1つにまとめています。

サンプルソース
private String createContent() throws Exception{
  //サンプルデータ生成
  //header
  Map header = new HashMap();
  header.put( "TANTOU_NAME", "○×" );

  //detail
  List detail = new ArrayList();
  Map detail1 = new HashMap();
  detail1.put( "DATE", "5月22日" );
  detail1.put( "ITEM", "バナナ" );
  detail1.put( "QUANTITY", "100" );
  detail1.put( "PRICE", "200" );
  detail1.put( "MONEY", "20,000" );
  detail.add( detail1 );
  Map detail2 = new HashMap();
  detail2.put( "DATE", "5月23日" );
  detail2.put( "ITEM", "みかん" );
  detail2.put( "QUANTITY", "120" );
  detail2.put( "PRICE", "50" );
  detail2.put( "MONEY", "6,000" );
  detail.add( detail2 );
  Map detail3 = new HashMap();
  detail3.put( "DATE", "5月23日" );
  detail3.put( "ITEM", "バナナ" );
  detail3.put( "QUANTITY", "100" );
  detail3.put( "PRICE", "100" );
  detail3.put( "MONEY", "10,000" );
  detail.add( detail3 );
  //footer
  Map footer = new HashMap();
  footer.put( "MAIL", "hoge@sample.com" );
      
  //xmlデータ生成(DOM)
  DocumentBuilderFactory dbfactory
     = DocumentBuilderFactory.newInstance();
  DocumentBuilder docbuilder = dbfactory.newDocumentBuilder();
  Document document = docbuilder.newDocument();

  Element root = document.createElement("data");
  document.appendChild(root);

  if( header != null ){
    Element sub  = document.createElement("header");
    root.appendChild( sub );
    for( Iterator iterator = header.entrySet().iterator(); 
         iterator.hasNext(); ){
      Map.Entry e = (Map.Entry)iterator.next();
      header.get( e.getKey() );
      Element key   = document.createElement( (String)e.getKey() );
      sub.appendChild( key );
      Text text
        = document.createTextNode( (String)header.get( e.getKey() ) );
      key.appendChild( text );
    }
  }
  
  if( detail != null ){
    for ( int i=0; i < detail.size(); i++ ){
      Element sub  = document.createElement("detail");
      root.appendChild( sub );
      Map map = (Map)detail.get(i);
      for( Iterator iterator =map.entrySet().iterator(); 
           iterator.hasNext(); ){
        Map.Entry e = (Map.Entry)iterator.next();
        map.get( e.getKey() );
        Element key   = document.createElement( (String)e.getKey() );
        sub.appendChild( key );
        Text text
           = document.createTextNode( (String)map.get( e.getKey() ) );
        key.appendChild( text );
      }
    }
  }
  
  if( footer != null ){
    Element sub  = document.createElement("footer");
    root.appendChild( sub );
    for( Iterator iterator =footer.entrySet().iterator(); 
         iterator.hasNext(); ){
      Map.Entry e = (Map.Entry)iterator.next();
      footer.get( e.getKey() );
      Element key   = document.createElement( (String)e.getKey() );
      sub.appendChild( key );
      Text text
        = document.createTextNode( (String)footer.get( e.getKey() ) );
      key.appendChild( text );
    }
  }
      
  //XSLTファイル取得
  String sXsl = "file:///sample01.xsl";

  StringWriter sw = new StringWriter();
  StreamResult sr = new StreamResult( sw );
  TransformerFactory tfactory = TransformerFactory.newInstance();
  Transformer transformer
    = tfactory.newTransformer( new StreamSource( sXsl ) );
  transformer.transform( new DOMSource(document), sr );
  String result = StringUtils.remove( sw.toString(), "\r" );
  return result;
}

 次ページよりソースコードの解説を行います。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5