InDesignドキュメントに、Javascriptを使ってXMLデータを読み込む方法を紹介します。
読み込みにはimportXMLメソッドを使いますが、その前にxmlImportPreferencesで読み込みオプションを設定します。
順を追って説明していきます。
公式サイト Adobe InDesignを詳しく見てみる
InDesignドキュメントにプレースホルダーを作成しておく
XMLデータを読み込むドキュメントは、既に下記のような表が作成してあることを前提にして説明します。
表は、「商品名」「商品番号」「サイズ」「色」などが一覧になっている、洋服の通販雑誌などでよく見る形です。

今回のXMLの読み込み例では、見出し(商品名)となるテキストの行と、3つの表を含むテキストフレームを1単位(1商品)として、複数のテキストフレーム(複数の商品)を読み込みます。
1つ目と3つ目の表の行数は、各商品の内容によって変わります。
プレースホルダーの作成については、表形式の例を以下で解説しています。
読み込み用のXMLデータを準備する
InDesignに読み込むXMLデータは、次のように作成してあります。

<Root>直下の<価格表群>タグは、上に示したドキュメントで選択されている一番大きなテキストフレームです。
その<価格表群>の下に、<価格表>タグで3つの商品情報が入っています。
<価格表>の中には、まず「商品名」が入り、改行したあとに表が続きます。
このInDesignの表は、一つの表として作ることもできますが、XMLデータを作る際の分かりやすさも考えて、3つの表がくっついた状態にしてあります。
ドキュメント展開するXMLデータの改行の扱いには、気をつける必要があります。
通常はXMLの改行は意味を持ちませんが、紙面での改行は改行文字です。
今回の例では、商品名の次には改行を入れたいので、そこだけ、改行を<商品名改行>タグで囲ってあります。
それ以外の改行は、エディタでの見易さのために改行しているだけなのでタグは付けていません。
InDesignに読み込むと無視されます。(というか、無視されるように読み込みオプションを設定します。)
ソースコードのサンプルと実行結果
プレースホルダとXMLデータの準備ができたので、以下のjavascriptで読み込んでみます。
#target "InDesign-14";
//今開いているドキュメントを取得
var myDoc = app.activeDocument;
//読み込みオプション設定を開始
var myXMLImpPrf = myDoc.xmlImportPreferences;
//選択した要素へ読み込むかどうか - ルート要素に読み込む
myXMLImpPrf.importToSelected = false;
//モード - 内容を結合
myXMLImpPrf.importStyle =XMLImportStyles.MERGE_IMPORT;
//リンクを作成するかどうか - 作成しない
myXMLImpPrf.createLinkToXML = false;
//XSLTを適用するかどうか - 適用しない
myXMLImpPrf.allowTransform = false;
//繰り返すテキストを要素を複製するかどうか - 複製する
myXMLImpPrf.repeatTextElements = true;
//既存の構造に一致する要素のみ読み込むかどうか - 一致要素のみでなく全体を読み込む
myXMLImpPrf.ignoreUnmatchedIncoming = false;
//タグが一致した場合テキスト要素を表に読み込むかどうか - 一致した場合表に読み込む
myXMLImpPrf.importTextIntoTables = true;
//空白のみの要素を読み込むかどうか - 読み込まない
myXMLImpPrf.ignoreWhitespace = true;
//読み込まれたXMLに一致しない要素、フレームおよび内容を削除するかどうか - 削除する
myXMLImpPrf.removeUnmatchedExisting =true;
//CALSテーブルをInDesignテーブルとして読み込むかどうか - しない
myXMLImpPrf.importCALSTables = false;
// XMLデータを読み込む
myDoc.importXML("C:/Users/riptin/Documents/XML組版_読込み.xml");
実行した結果、こうなりました。

xmlImportPreferencesの設定内容
XMLデータをInDesignに読み込みには、読み込み方法の設定が欠かせません。
今回のXML読み込みオプションは、次の設定で読み込んでいます。
今回の読み込みで特に重要な設定5つを解説します。
「繰り返すテキスト要素を複製」をtrue
読み込み用に準備したInDesignドキュメント(プレースホルダ)には、ひとつの商品を流し込むためのテキストフレームを、ひとつだけ作成してあります。
このテキストフレーム(ひとつの商品)を、読み込むXMLデータにしたがって、必要な数を複製しながら流し込みます。
そのために「繰り返すテキスト要素を複製」をチェック(true)します。
このケースでは、falseで読み込んだ場合(他の設定は変更なし)はプレースホルダーは複製されず、以下のようになってしまいます。

「既存の構造に一致する要素のみ読み込む」をfalse
各テキストフレーム(各商品)内の表は、情報量によって行数を変える必要があります。
「既存の構造に一致する要素のみ読み込む」をチェック(true)してしまうと、既存の構造に一致する行数分しか読み込めません。
ここでは表内の行を増やす必要があるので、「既存の構造に一致する要素のみ読み込む」のチェックを外し(false)ます。
このケースでは、trueで読み込んだ場合(他の設定は変更なし)は、もとのプレースホルダーの行数は変わらず、行数は増えません。

「タグが一致した場合テキスト要素を表に読み込む」をtrue
タグの一致したXMLデータを表組みに流し込む際には、「タグが一致した場合テキスト要素を表に読み込む」をチェック(true)します。
このケースでは、falseで読み込んだ場合(他の設定は変更なし)は、データは表に読み込まれません。

「空白のみの要素を読み込まない」をtrue
2つ目の表の「商品番号」「色番号」「サイズ番号」など、表のマクラの部分は、XMLデータに文字を入れておらずカラ要素にしてあります。
カラ要素のXMLデータを読み込んで、InDesignの表のマクラ文字を上書きして消してしまわないために、「空白のみの要素を読み込まない」をチェック(true)します。
空白のみの要素には、上記のようなタグのみしかないカラ要素のほかに、改行やタブも含まれます。
なので、もし「空白のみの要素を読み込む」ことにしてしまうと、単にXMLデータの見易さのために入れてある改行も、読み込まれてしまうことになります。
このケースでは、falseで読み込んだ場合(他の設定は変更なし)は、タグの付いていない改行や、空白要素もXMLデータから読み込まれます。

「読み込まれたXMLに一致しない要素、フレームおよび内容を削除」をtrue
今回の例では、各商品の情報量によって表内の行を増やします。
例えば「Aブラウス」のサイズは「5L」まで、「Bブラウス」はLLまで、「Cブラウス」は4Lまでというように、その数に応じた行数を表示するわけです。
その際、例えば「Aブラウス」で5Lまで追加された行は、次の「Bブラウス」ではLLまでしか必要ないので、3Lから5Lまでの不要な行は削除する必要があります。
「読み込まれたXMLに一致しない要素、フレームおよび内容を削除」をチェック(true)すると、XMLデータの情報量に応じて行数が加減されます。
このケースでは、falseで読み込んだ場合(他の設定は変更なし)は、一度増えた行数が、それ以降でも削除されません。

公式サイト Adobe InDesignを詳しく見てみる
コメント