InDesignでXMLを扱う際、XMLの構造面から各要素にアクセスするのは、比較的考えやすいです。
だけど、たとえばスクリプトで「8ページにあるテキストフレーム内のXML要素にアクセスしたい」というときは、どうすればいいだろうか…
そういうときは、「そのテキストフレームにXMLタグがついているかどうか」あるいは「その文字列がXMLタグ[ ]かどうか」というように、オブジェクトの属性を調べて判断します。
ドキュメントサンプル
次のような、InDesignのページ内にテキストフレームが2つあるドキュメントを用意しました。
赤枠で囲まれているのは、<著者紹介>のXMLタグのついたテキストフレーム。
さらに、その中の文字列「リプちん」には<著者>のXMLタグがついています。
その下にある「アプりん」の文字の入ったテキストフレームにはXMLタグはついていません。
これらページアイテムに、associatedXMLElement(s)プロパティを使って「XMLタグが付いているかどうか」を調べます。

コードサンプル
#target indesign
var objDoc = app.activeDocument;
var toString = Object.prototype.toString;
var objTextframe_riptin = objDoc.pages[0].textFrames[1];
var objTextframe_aprin = objDoc.pages[0].textFrames[0];
// 「リプちん」のテキストフレームの4文字目
var ret_riptin= toString.call(objTextframe_riptin.characters[3].associatedXMLElements);
// 「アプりん」のテキストフレームの1文字目
var ret_aprin= toString.call(objTextframe_aprin.characters[0].associatedXMLElements);
// 「リプちん」のテキストフレーム
var ret_txtfrm= toString.call(objTextframe_riptin.associatedXMLElement);
alert("「リプちん」のテキストフレームの4文字目 : " + ret_riptin + "\n\n" +
"「アプりん」のテキストフレームの1文字目 : " + ret_aprin + "\n\n" +
"「リプちん」のテキストフレーム : " + ret_txtfrm, "戻り値");
実行結果
判定結果を、alert()の文字列として表示しました。
XMLタグを認識したところは、”[object XMLElement]”と表示されています。

サンプルの解説
associatedXMLElement(s)プロパティを使う前に、ポイントが2つあります。
JavaScriptの Object.prototype.toString()
InDesignのページアイテムに対してassociatedXMLElement(s)プロパティを使うと、戻り値として、そのアイテムがXMLのアイテムであればXMLItemが返ります。
なので、その戻り値の型を調べれば良いのですが、JavaScriptのtypeof演算子の型判定では望むところの判定ができません。
そこで Object.prototype.toStringを使って、詳細な型を調べ、さらにそれをtoStringで文字列に変換して受け取ります。
サンプルでは、4行目で次のように宣言しています。
var toString = Object.prototype.toString;
文字列のXMLタグを表している[ ]は、character
文字列にXMLタグをつけると、その文字列が[ ]で囲まれます。
この[ ]は、ただの見た目ではなく、実際にそこに[ ]があります。
試しに[ ]の前後をカーソルで移動すると、[ ]の前後にもカーソルが入るので、その存在をはっきり認識できると思います。
[ ]が認識できるなら、コイツを使わないテはありません。
「コイツ」を、characterとして捉えます。
なので「著者:リプちん」の「リ」の前の「コイツ」は、先頭から4つめのcharacterというわけです。
サンプルの9・11行目では、テキストフレーム内のcharacterをtoStringの引数として渡しています。
var ret_riptin= toString.call(objTextframe_riptin.characters[3].associatedXMLElements);
var ret_aprin= toString.call(objTextframe_aprin.characters[0].associatedXMLElements);
associatedXMLElements と associatedXMLElement
associatedXMLElementは、sがあったり、なかったり、ミスタイプしそうですが、
characterなど文字関連には、associatedXMLElements。
それ以外では、associatedXMLElementです。
戻り値は、文字列 “[object XMLElement]”
サンプルコードでは、最後にアラート表示で戻り値を表示しました。
実際には、戻り値によってその後の処理をif文で分岐させたり、あるいは、toStringに渡す引数のページアイテムをfor文でループさせたりします。
公式サイト Adobe InDesignを詳しく見てみる
コメント