SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

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

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

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

メール配信機能を実装する際にテンプレートに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;
}

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

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
ソースコードの解説

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

kox(ケイオーエックス)

業務系保守担当

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1430 2007/07/05 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング