Reflex iTextではテンプレート作成のためのマクロとして、 前述のページ再利用(includeマクロ)のほかに、条件分岐(ifマクロ)、繰り返し処理(forマクロ)を用意しています。
エンティティ項目の値が、指定した値と等しい場合、ifマクロ(<div class="_if">)で囲まれた範囲を表示します。
式は、value属性に "項目名 = '値'" を指定します。
<?xml version="1.0" encoding="UTF-8" ?>
<html>
<head>
</head>
<body>
<div class="_page" style="pagesize:A5; orientation:landscape;">
<table cellpadding="2" cellspacing="1">
<tr>
<td>
<span style="size:18;">
セール情報 --
</span>
<span id="season" />
<span>
--
</span>
<br/>
<br/>
</td>
</tr>
<div class="_if" value="season='summer'"> <!-- ここから season='summer' のみ表示 -->
<tr>
<td>
<span style="size:18;">
サマーバーゲン開催中
</span>
<br/>
</td>
</tr>
</div> <!-- ここまで -->
<div class="_if" value="season='winter'"> <!-- ここから season='winter' のみ表示 -->
<tr>
<td>
<span style="size:18;">
歳末バーゲン開催中
</span>
</td>
</tr>
</div> <!-- ここまで -->
</table>
<table cols="2" border="2" frame="box" cellpadding="1" cellspacing="1">
<tr>
<th align="center" style="right:true; bottom:true;">商品</th>
<th align="center" style="bottom:true;">価格</th>
</tr>
<tr>
<td style="right:true; bottom:true;">カットソー</td>
<td style="bottom:true;">1000円から</td>
</tr>
<tr>
<td style="right:true; bottom:true;">パンツ</td>
<td style="bottom:true;">1200円から</td>
</tr>
<tr>
<td style="right:true; bottom:true;">スカート</td>
<td style="bottom:true;">1500円から</td>
</tr>
</table>
</div>
</body>
</html>
package jp.reflexworks.test.model;
import java.util.List;
import java.util.ArrayList;
public class IfMacroList {
public static List ifMacro;
static {
ifMacro = new ArrayList();
IfMacro macroData = new IfMacro();
macroData.season = "spring";
ifMacro.add(macroData);
macroData = new IfMacro();
macroData.season = "summer";
ifMacro.add(macroData);
macroData = new IfMacro();
macroData.season = "autumn";
ifMacro.add(macroData);
macroData = new IfMacro();
macroData.season = "winter";
ifMacro.add(macroData);
}
}
package jp.reflexworks.test.model;
public class IfMacro {
public String season;
}
<ifMacroList>
<ifMacro>
<season>spring</season>
</ifMacro>
<ifMacro>
<season>summer</season>
</ifMacro>
<ifMacro>
<season>autumn</season>
</ifMacro>
<ifMacro>
<season>winter</season>
</ifMacro>
</ifMacroList>
{"ifMacroList" :
{"ifMacro" :
[{"season" : "spring"},
{"season" : "summer"},
{"season" : "autumn"},
{"season" : "winter"}
]
}
}

Listの件数分、もしくは指定した一定回数分を繰り返したい場合、forマクロ(<div class="_for">)を使用します。
forマクロで囲まれた範囲(<div class="_for">~</div>)が繰り返されます。
value属性にListの項目名、もしくは数字を指定します。
<?xml version="1.0" encoding="UTF-8" ?>
<html>
<head>
</head>
<body>
<div class="_page" style="pagesize:A5; orientation:landscape;">
<table cellpadding="2" cellspacing="1">
<tr>
<td>
<span style="size:18;">
セール情報 --
</span>
<span id="season" />
<span>
--
</span>
<br/>
<br/>
</td>
</tr>
</table>
<table cols="2" border="2" frame="box" cellpadding="1" cellspacing="1">
<tr>
<th align="center" style="right:true; bottom:true;">商品</th>
<th align="center" style="bottom:true;">価格</th>
</tr>
<div class="_for" value="item"> <!-- 繰り返し処理 ここから -->
<tr>
<td style="right:true; bottom:true;">
<span id="name-i" /> <!-- List内の項目 -->
</td>
<td style="right:true; bottom:true;">
<span id="price-i" /> <!-- List内の項目 -->
</td>
</tr>
</div> <!-- ここまで -->
</table>
</div>
</body>
</html>
package jp.reflexworks.test.model;
import java.util.ArrayList;
import java.util.List;
public class ForMacroList {
public static List forMacro;
static {
forMacro = new ArrayList();
ForMacro macroData = new ForMacro();
macroData.season = "spring";
List item = new ArrayList();
Item itemData = new Item();
itemData.name = "カットソー";
itemData.price = "1200円から";
item.add(itemData);
itemData = new Item();
itemData.name = "ブラウス";
itemData.price = "1200円から";
item.add(itemData);
itemData = new Item();
itemData.name = "ワンピース";
itemData.price = "2500円から";
item.add(itemData);
macroData.item = item;
forMacro.add(macroData);
macroData = new ForMacro();
macroData.season = "summer";
item = new ArrayList();
itemData = new Item();
itemData.name = "Tシャツ";
itemData.price = "500円から";
item.add(itemData);
itemData = new Item();
itemData.name = "パンツ";
itemData.price = "1500円から";
item.add(itemData);
itemData = new Item();
itemData.name = "ワンピース";
itemData.price = "2000円から";
item.add(itemData);
itemData = new Item();
itemData.name = "タンクトップ";
itemData.price = "500円から";
item.add(itemData);
macroData.item = item;
forMacro.add(macroData);
macroData = new ForMacro();
macroData.season = "autumn";
item = new ArrayList();
itemData = new Item();
itemData.name = "カットソー";
itemData.price = "1200円から";
item.add(itemData);
itemData = new Item();
itemData.name = "カーディガン";
itemData.price = "2800円から";
item.add(itemData);
macroData.item = item;
forMacro.add(macroData);
macroData = new ForMacro();
macroData.season = "winter";
item = new ArrayList();
itemData = new Item();
itemData.name = "コート";
itemData.price = "15000円から";
item.add(itemData);
itemData = new Item();
itemData.name = "セーター";
itemData.price = "2000円から";
item.add(itemData);
itemData = new Item();
itemData.name = "カーディガン";
itemData.price = "2500円から";
item.add(itemData);
itemData = new Item();
itemData.name = "マフラー";
itemData.price = "1500円から";
item.add(itemData);
macroData.item = item;
forMacro.add(macroData);
}
}
package jp.reflexworks.test.model;
import java.util.List;
public class ForMacro {
public String season;
public List item; // このListの件数分繰り返します
}
package jp.reflexworks.test.model;
public class Item {
public String name;
public String price;
}
<?xml version="1.0" encoding="UTF-8" ?>
<forMacroList>
<forMacro>
<season>spring</season>
<item>
<name>カットソー</name>
<price>1200円から</price>
</item>
<item>
<name>ブラウス</name>
<price>1200円から</price>
</item>
<item>
<name>ワンピース</name>
<price>2500円から</price>
</item>
</forMacro>
<forMacro>
<season>summer</season>
<item>
<name>Tシャツ</name>
<price>500円から</price>
</item>
<item>
<name>パンツ</name>
<price>1500円から</price>
</item>
<item>
<name>ワンピース</name>
<price>2000円から</price>
</item>
<item>
<name>タンクトップ</name>
<price>500円から</price>
</item>
</forMacro>
<forMacro>
<season>autumn</season>
<item>
<name>カットソー</name>
<price>1200円から</price>
</item>
<item>
<name>カーディガン</name>
<price>2800円から</price>
</item>
</forMacro>
<forMacro>
<season>winter</season>
<item>
<name>コート</name>
<price>15000円から</price>
</item>
<item>
<name>セーター</name>
<price>2000円から</price>
</item>
<item>
<name>カーディガン</name>
<price>2500円から</price>
</item>
<item>
<name>マフラー</name>
<price>1500円から</price>
</item>
</forMacro>
</forMacroList>
{"forMacroList" :
{"forMacro" :
[{"season" : "spring",
"item" :
[{"name" : "カットソー", "price" : "1200円から"},
{"name" : "ブラウス","price" : "1200円から"},
{"name" : "ワンピース","price" : "2500円から"}
]
},
{"season" : "summer",
"item" :
[{"name" : "Tシャツ","price" : "500円から"},
{"name" : "パンツ","price" : "1500円から"},
{"name" : "ワンピース","price" : "2000円から"},
{"name" : "タンクトップ","price" : "500円から"}
]
},
{"season" : "autumn",
"item" :
[{"name" : "カットソー","price" : "1200円から"},
{"name" : "カーディガン","price" : "2800円から"}
]
},
{"season" : "winter",
"item" :
[{"name" : "コート","price" : "15000円から"},
{"name" : "セーター","price" : "2000円から"},
{"name" : "カーディガン","price" : "2500円から"},
{"name" : "マフラー","price" : "1500円から"}
]
}]
}
}

forマクロ内で、List内の項目を繰り返し表示したい場合、後ろに添え字を表す文字 "-i" を付加します。 二次元配列の場合、"-i-j"と付加します。
また、"-i-0"、"-i-1" など、"-i"の後に数を付加することでカラム列を指定できます。
<?xml version="1.0" encoding="UTF-8" ?>
<html>
<head>
</head>
<body>
<div class="_page" style="pagesize:A5; orientation:landscape;">
<table cellpadding="2" cellspacing="1">
<tr>
<td>
<span style="size:18;">
セール情報 --
</span>
<span id="season" />
<span>
--
</span>
<br/>
<br/>
</td>
</tr>
</table>
<table cols="2" border="2" frame="box" cellpadding="1" cellspacing="1">
<tr>
<th align="center" style="right:true; bottom:true;">商品</th>
<th align="center" style="bottom:true;">価格</th>
</tr>
<div class="_for" value="item">
<tr>
<td style="right:true; bottom:true;">
<span id="item-i-0" />
</td>
<td style="right:true; bottom:true;">
<span id="item-i-1" />
</td>
</tr>
</div>
</table>
</div>
</body>
</html>
package jp.reflexworks.test.model;
import java.util.ArrayList;
import java.util.List;
public class ForMacroArrayList {
public static List forMacro;
static {
forMacro = new ArrayList();
ForMacro macroData = new ForMacro();
macroData.season = "spring";
List item = new ArrayList();
ItemArray itemData = new ItemArray();
itemData._$$text = "カットソー";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "1200円から";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "ブラウス";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "1200円から";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "ワンピース";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "2500円から";
item.add(itemData);
macroData.item = item;
forMacro.add(macroData);
macroData = new ForMacro();
macroData.season = "summer";
item = new ArrayList();
itemData = new ItemArray();
itemData._$$text = "Tシャツ";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "500円から";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "パンツ";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "1500円から";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "ワンピース";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "2000円から";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "タンクトップ";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "500円から";
item.add(itemData);
macroData.item = item;
forMacro.add(macroData);
macroData = new ForMacro();
macroData.season = "autumn";
item = new ArrayList();
itemData = new ItemArray();
itemData._$$text = "カットソー";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "1200円から";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "カーディガン";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "2800円から";
item.add(itemData);
macroData.item = item;
forMacro.add(macroData);
macroData = new ForMacro();
macroData.season = "winter";
item = new ArrayList();
itemData = new ItemArray();
itemData._$$text = "コート";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "15000円から";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "セーター";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "2000円から";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "カーディガン";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "2500円から";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "マフラー";
item.add(itemData);
itemData = new ItemArray();
itemData._$$text = "1500円から";
item.add(itemData);
macroData.item = item;
forMacro.add(macroData);
}
}
package jp.reflexworks.test.model;
import java.util.List;
public class ForMacro {
public String season;
public List item; // このListの件数分繰り返します
}
package jp.reflexworks.test.model;
public class ItemArray {
public final int _$$col = 2;
public String _$$text;
public int get_$$col() {
return this._$$col;
}
public String get_$$text() {
return this._$$text;
}
public void set_$$text(String _$$text) {
this._$$text = _$$text;
}
}
{"forMacroArrayList" :
{"forMacro" :
[{"season" : "spring",
"item" :
[["カットソー","1200円から"],
["ブラウス","1200円から"],
["ワンピース","2500円から"]]
},
{"season" : "summer",
"item" :
[["Tシャツ","500円から"],
["パンツ","1500円から"],
["ワンピース","2000円から"],
["タンクトップ","500円から"]]
},
{"season" : "autumn",
"item" :
[["カットソー","1200円から"],
["カーディガン","2800円から"]]
},
{"season" : "winter",
"item" :
[["コート","15000円から"],
["セーター","2000円から"],
["カーディガン","2500円から"],
["マフラー","1500円から"]]
}]
}
}
