読者です 読者をやめる 読者になる 読者になる

ReVIEWの生成したXMLをInDesignに取り込む時のXSL例

 そもそもReVIEWのXMLInDesignに取り込むことをひとつの前提にしていますが、そのままだとちょっと取り扱いにくい場面があるかもしれません。例えば見出し(title要素)やリード(p要素)は属性で階層化されていますし、図・表・リストでキャプションの順序やスタイルを少し変えたい時などもあります。おそらく、一旦流し終えた後にスタイル判定のためにスクリプト処理しなければならないでしょう。
 まあ、だったら要素分けの部分とかはXSLT使うといいんじゃないか、と。

 おうち使いなので、抜けてるブロック要素もあるかもしれません。あと「InDesign読み込みオプション」ダイアログでXSLTを有効にすると、いろいろエラーが出たりします(なのでxsltprocで変換しています)。全体的にもっといい書き方があったら教えてください^^

<?xml version="1.0" encoding="UTF-8"?>
<!-- ReVIEWのためのXSL例
2012-01-25	とりあえず
2012-03-02	修正
 -->


<xsl:transform
	version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"
	exclude-result-prefixes="aid"
>
	<xsl:output method="xml" media-type="text/xml"/>

	<!-- 改行のための変数 -->
	<xsl:variable name="myReturn">
		<xsl:text>
</xsl:text>
	</xsl:variable>


	<!-- ルート -->
	<xsl:template match="/">
		<xsl:element name="aid:doc">
			<xsl:apply-templates />
		</xsl:element>
	</xsl:template>

	<xsl:template match="doc">
		<xsl:apply-templates />
	</xsl:template>




	<!-- title見出しまわり。pstyleをそのまま要素名にする -->
	<xsl:template match="title">
		<xsl:for-each select=".">
		<xsl:element name="{@aid:pstyle}">
			<xsl:copy-of select="node()" />
		</xsl:element>
		</xsl:for-each>
	</xsl:template>


	<!-- lead内段落 -->
	<xsl:template match="lead">
		<xsl:for-each select="p">
			<xsl:element name="lead">
				<xsl:copy-of select="node()" />
			</xsl:element>
		<xsl:value-of select="$myReturn" />
		</xsl:for-each>
	</xsl:template>

	<!-- column -->
	<xsl:template match="column">
		<xsl:element name="column">
			<xsl:element name="column-title">
				<xsl:copy-of select="title/node()" />
			</xsl:element>
			<xsl:value-of select="$myReturn" />
			<xsl:for-each select="p">
				<xsl:element name="column-p">
					<xsl:copy-of select="node()" />
				</xsl:element>
			<xsl:value-of select="$myReturn" />
			</xsl:for-each>
		</xsl:element>
	</xsl:template>


	<!-- codelist(通常のlist) -->
	<xsl:template match="codelist">
		<xsl:element name="codelist-caption">
			<xsl:copy-of select="caption/node()" />
		</xsl:element>
		<xsl:value-of select="$myReturn" />
		<xsl:element name="codelist-pre">
			<xsl:copy-of select="pre/node()" />
		</xsl:element>
	</xsl:template>


	<!-- codelist (参照なしのemlist)-->
	<xsl:template match="list[@type='emlist']">
		<xsl:element name="codelist-caption">
			<xsl:copy-of select="caption/node()" />
		</xsl:element>
		<xsl:value-of select="$myReturn" />
		<xsl:element name="codelist-pre">
			<xsl:copy-of select="pre/node()" />
		</xsl:element>
	</xsl:template>


	<!-- 箇条リスト -->
	<xsl:template match="ul">
	<xsl:variable name="myCount_li" select="count(li)" /><!-- li要素の数を変数に -->
		<xsl:for-each select="li">
			<xsl:element name="list">
				<xsl:attribute name="current_no"><xsl:value-of select="position()" /></xsl:attribute>
				<xsl:attribute name="total_no"><xsl:value-of select="$myCount_li" /></xsl:attribute>
				<xsl:copy-of select="node()" />
			</xsl:element>
			<xsl:value-of select="$myReturn" />
		</xsl:for-each>
	</xsl:template>


	<!-- 画像とキャプション -->
	<xsl:template match="img">
		<xsl:copy-of select="Image" />
		<xsl:value-of select="$myReturn" />
		<xsl:if test="caption">
			<xsl:element name="img-caption">
				<xsl:copy-of select="caption/node()" />
			</xsl:element>
		</xsl:if>
	</xsl:template>




	<!-- 表組み(そのまま) -->
	<xsl:template match="table">
			<xsl:copy-of select="." />
	</xsl:template>


	<!-- 本文(そのまま) -->
	<xsl:template match="p">
			<xsl:copy-of select="." />
	</xsl:template>
	


</xsl:transform>

page2012の無料セミナーでReVIEWのデモを見られます

2012年2月8日の14:10〜15:05、page2012の無料セミナーゾーンで、ReVIEW開発者の武藤健志さんによるReVIEWデモを見られます。
http://study-room.info/id/page2012/#muto