Tuesday, January 18, 2011 / InDesign, DTP, XML

InDesign , XML文書からテーブルを生成する

InDesign では XML文書を流し込み組版するための仕組みが予め備わっています。 所定のルールでXMLを書いておき、それを所定の方法で読み込めばよいだけです。

たとえば、こんな感じ…

<?xml version="1.0" encoding="UTF-8"?>
<story xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/">
  <Table aid:table="table" aid:trows="3" aid:tcols="2">
    <Cell aid:table="cell" aid:theader="" aid:crows="1" aid:ccols="1" aid:ccolwidth="150.0">見出しA</Cell>
    <Cell aid:table="cell" aid:theader="" aid:crows="1" aid:ccols="1" aid:ccolwidth="150.0">見出しB</Cell>
    <Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="150.0">内容A-1</Cell>
    <Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="150.0">内容B-1</Cell>
    <Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="150.0">内容A-2</Cell>
    <Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="150.0">内容B-2</Cell>
  </Table>
</story>

別に難しいことはないですが、 aid: で名前空間を指定してXMLを記述していくのが面倒ですね。

この記述の手間を省くには…… 余計面倒な気もしますが、 とりあえず以下のようにすれば、XML文書から名前空間の記述を省いて作成して、あとからそれを機械的に(バッチ処理などで)追加することも可能です。

名前空間なしのシンプルなXML文書

<?xml version="1.0" encoding="UTF-8"?>
<story>
  <Table table="table" trows="3" tcols="2">
    <Cell table="cell" theader="" crows="1" ccols="1" ccolwidth="150.0">見出しA</Cell>
    <Cell table="cell" theader="" crows="1" ccols="1" ccolwidth="150.0">見出しB</Cell>
    <Cell table="cell" crows="1" ccols="1" ccolwidth="150.0">内容A-1</Cell>
    <Cell table="cell" crows="1" ccols="1" ccolwidth="150.0">内容B-1</Cell>
    <Cell table="cell" crows="1" ccols="1" ccolwidth="150.0">内容A-2</Cell>
    <Cell table="cell" crows="1" ccols="1" ccolwidth="150.0">内容B-2</Cell>
  </Table>
</story>

以下のXSLで名前空間を追加

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"
    xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/"
    version="1.0">

    <xsl:output method="xml" indent="yes" encoding="UTF-8" />

    <xsl:template name="table-proc" >
       <xsl:element name="{name()}" >
         <xsl:for-each select="@*">
          <xsl:attribute name="aid:{name()}">
              <xsl:value-of select="." />
          </xsl:attribute>
         </xsl:for-each>

         <xsl:apply-templates />
       </xsl:element>
    </xsl:template>

    <xsl:template match="Cell">
       <xsl:call-template name="table-proc" />
    </xsl:template>

    <xsl:template match="Table">
       <xsl:call-template name="table-proc" />
    </xsl:template>
</xsl:stylesheet>

たとえば、XML文書が mytable.xml で XSLが convert.xsl だった場合 それらを使って InDesign 用XML文書に変換するには以下のようにします。

xsltproc convert.xsl mytable.xml > mytable-for-indesign.xml

たくさんXML文書を用意する場合は、XSLを使うと楽かもしれない。