SHOEISHA iD

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

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

特集記事

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

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

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

ソースコードの解説

サンプルデータの生成

 最初はサンプルデータを生成している部分になります。

//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", "バナナ" );

  ...(省略)

 便宜上見やすくするために、はじめにすべてのデータをListおよびMapに入れています。keyとなる部分はDBからの項目名などを想定しています。ヘッダ部、明細部、フッター部に分けて格納します。

DOMを使用したXMLデータの生成

 次はXMLを生成する部分です。

 生成したサンプルデータを元に、DOMを使用してXMLを生成しています。固定のノードdata、header、detail、footerを生成し、ぞれぞれの配下に動的なノードを生成してます。以下のようなイメージです。

data
  |----header
  |      |-----動的なノード
  |
  |----detail
  |      |-----動的なノード
  |
  |----footer
  |      |-----動的なノード

 ソースコードはこの部分が該当します。

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

生成されるXMLデータ

 生成されるXMLデータは以下のようになります。

<data>
  <header>
  <TANTOU_NAME>○×</TANTOU_NAME>
  </header>
  <detail>
    <DATE>5月22日</DATE>
    <ITEM>バナナ</ITEM>
    <QUANTITY>100</QUANTITY>
    <PRICE>200</PRICE>
    <MONEY>20,000</MONEY>
  </detail>
  <detail>
    <DATE>5月23日</DATE>
    <ITEM>みかん</ITEM>
    <QUANTITY>120</QUANTITY>
    <PRICE>50</PRICE>
    <MONEY>6,000</MONEY>
  </detail>
  <detail>
    <DATE>5月23日</DATE>
    <ITEM>バナナ</ITEM>
    <QUANTITY>100</QUANTITY>
    <PRICE>100</PRICE>
    <MONEY>10,000</MONEY>
  </detail>
  <footer>
    <MAIL>hoge@sample.com</MAIL>
  </footer>
</data>

 ここでは分かりやすいようにノードを大文字、小文字を意識的に区別して使用しています。

XSLTファイルレイアウトに合わせて変換

 最後にXSLTファイルを取得し、XMLデータをXSLTファイルのレイアウトに合わせて文字列に変換します。変換された文字列をメールの本文に組み込むことで、XSLTファイルのレイアウトでメールを配信することができます。

//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;

次のページ
XSLTファイルの生成

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

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

もっと読む

この記事の著者

kox(ケイオーエックス)

業務系保守担当

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング