Translation:Programmin
From IDMLWiki
Contents |
プログラミング
XSLTパターン
IDMLパッケージ内のXMLファイルで必要なほとんどの変更は、XSLTで処理されます。(サンプル作成時、最初はいくつかのDOM操作を手動で行いましたが、XSLTのほうがより効率がよく、維持できました)
IDMLコンテンツをXSLTで生成したり処理するときに効果を発揮する、いくつかのパターンです。
- テンプレート
- XSLTスタイルシートには、静的なコンテンツと動的なコンテンツがコンビで含まれています。スタイルシートは、テンプレートとして使われ、いくつかの新しいIDMLコンテンツに拡張されます。サンプルPage BuilderとICML Builderにこの例があります。
- 変換
- XSLTスタイルシートには、既存のIDMLファイルを処理するための指示が含まれています。この例では、出力形式はIDMLファイルです。スタイルシートには重要な静的コンテンツはありません。代わりに、IDMLファイルを変換する指示が含まれています。ほとんどの場合、1回かそれ以上の変換では同一変換になります。他のサンプルでこのパターンを使っています。サンプルConditional Textは良い例です。
- ハイブリッド
- いくつかのソリューションでは、テンプレートと変換パターンの両方を求められます。サンプルAdd Catalog Pagesはその例です。変換パターンはdesignmap.xmlファイルを更新するために使用され、これは新規スプレッドと新規ストーリーを追加するために必要です。新規スプレッドと新規ストーリーファイルの生成は、テンプレートのパターンはに従います。
- パラメータ
- XSLTに基づいた柔軟なソリューションでは、様々な入力を扱えなければなりません。XSLTでは、<xsl:param>エレメントでデータをスタイルシートに受け渡しています。ほぼすべてのサンプルでは、パラメータをIDMLに渡しています。IDのような情報は書き出しから書き出しを経て変更されることがあるので、特に重要です。典型的なパターンは、JavaでIDMLファイルの情報を見つけて、パラメータを使ってスタイルシートに渡すという使い方です。PackageInspectorとXmlUtilsクラスには、IDMLファイル内で情報を見つけるためのコードが含まれており、FileTransformerクラスにはパラメータの特定と、変換を実行するためのサポートが含まれています。
- 複数の出力
- IDMLファイルにはたくさんのファイルがあるため、いくつかのテンプレートごとに分けることは有効です。xsl:ドキュメントエレメントは複数の出力ファイルを作成するときに使われます。サンプルPage Builderを参照してください。
- 複数の入力
- 1つのIDMLファイルを、別の変換のための入力として使用する必要が時としてあります。XSLTではdocument()関数で行います。サンプルCopy Styleで、この関数を使ってソースドキュメントのスタイルを、変換されたドキュメントにコピーしています。
Javaの役割
サンプルでは、XLSLTで容易ではない処理をJavaを使って行っています。他のプログラミング言語でも可能です。サンプルIDMLToolsで、Javaは下記のように使われています。
- コマンドラインからの入力を許可
- ZIPファイルの圧縮と解凍(Packageクラス参照)
- テンポラリーファイルとフォルダの管理(FileUtilsクラス参照)
- パッケージの詳細をとらえ、特定のパッケージの場所を見つける(PackageXmlLocator参照)
- XSLとパッケージ内のXMLファイルのマッチング(PackageXslLocator参照)
- XSLT変換の開始(FileTransformerクラスとPackageTransformerクラス参照)
- JavaバリデータライブラリのJINGを呼び出す(Validatorクラス参照)
- 既存のIDMLファイルからデータを見つける(PackageInspectoryクラスとXmlUtilsクラス参照。または次項に詳細)
Javaを使ってデータを見つける
IDMLToolsには、IDMLパッケージ内でデータを見つけるクラスが2つあります。高レベルのPackageInspectorクラスは、IDMLパッケージから情報を抽出するたくさんのメソッドを含んでいます。例えば、ページの高さ、幅、ページ数を知りたいときは、単純にIDMLファイルまたは抽出されたIDMLファイルを含むディレクトリへのパスから、PackageInspectorを構成し、GetPageHeight()やGetPageWidth()、またはGetPageCount()メソッドを呼び出します。
PackageInspector inspector = new PackageInspector(tempDir); double pageHeight = inspector.GetPageHeight();
PackageInspectorは、JavaとXPATHを結合してパッケージから情報を抽出するための、より強力なXmlUtilsクラスにとって、本当に便利なラッパクラスです。次項は、XmlUtilsを使ってデータを見つける方法の例です。
名前からレイヤーIDを得る方法
XmlUtilsを使うと、IDMLファイルから簡単に属性を抽出できます。この例では、(スキーマから)データがdesignmap.xmlファイルにあることがわかっています。既知のXMLファイルからデータを得るには、1つのファイルパスとXPATHステートメントでXmlUtils.getAttributeのバージョンを呼び出します。XPATHステートメントはデータの場所を特定します。この例では、レイヤーオブジェクトのSelf属性は、Documentエレメントにあります。パスは、Name属性が「text」のレイヤーを探していることを示します。
「text」という名前のレイヤーを抽出するには、次を実行します。
XmlUtils.getAttribute(xmlLoc.getDesignMapFilePath(),
"/Document/Layer[@Name = 'text']/@Self");
xmlLoc(PackageXmlLocatorのインスタンス)が、stringでdesignmap.xmlファイルのパスの特定に使われています。
名前からマスタースプレッドのIDを得る方法
XmlUtilsは、XMLファイルのセットからひとつの属性を見つけることもできます。この例では、マスタースプレッドのXMLファイルの集まりがあります。次の呼び出しで、Name属性が「D-catalog」であるマスタースプレッドのSelf属性を見つけます。
String masterSpreadID = XmlUtils.getAttribute(xmlLoc.getMasterSpreadXmlFiles(), "/idPkg:MasterSpread/MasterSpread[@Name = 'D-catalog']/@Self");
XPATHステートメントが1つの属性以外のものを返すと、PackageExceptionが投げられます。
複数の属性を得る方法
XmlUtilsには、属性のArrayListを返すメソッドもあります。これらのメソッドは、上述と似ていますが、単一の文字列ではなくArrayListを返します。単一ファイルと、ファイルのArrayListの両方で操作するバージョンがあります。
名前またはIDを値にマップするHashTableを得る方法
XmlUtilsには、getAttributePairsForElement()というメソッドがあり、Selfなどのユニークな属性と他の属性をマップするHashTableを作成します。PackageInspector.GetObjectStyleIDNamePairs()に、この例があります。
