XMLによる組版タグ処理への応用
XSLTを使う
2000年10月3日
岸 和孝
日本印刷技術協会 客員研究員
要 約
現在,わが国では経済の活性化を求めて電子商取引へ多くの企業が参入しつつあり,その電子データ交換様式としてXMLの採用が進んでいる。 その中でも,とりわけXML文書を別の表現形式(フォーマット)へ変換(または変形)する機能である XSLT への関心が高まっている。
各種の XSLプロセッサー が開発されており,XMLベースのシステム構築の条件は整いつつある。しかし, XSLT は XSL の一部分に過ぎず,印刷への応用については時期尚早である,と思われる。
私は,通信における文書交換を確立するために,SGML/XMLツールは,いかなるプラットフォームでも動作するフリーウェアでなければならないと考えている。とりわけ整備の遅れているMacOS環境で動作するツールを開発し普及する活動を行っている。そうした観点から,ここでは,フリーウェアの XSLプロセッサー について述べる。
目 次
XSL 規格は,まだW3C作業案の段階であるが,近いうちに承認され,W3C勧告となる見通しである。
XSL 規格の要約では,次のように述べられている。
XSL は,スタイルシートを表すための言語であり,次の二つの部分から成る。
XSLスタイルシートは,フォーマットボキャブラリ(フォーマットのためのタグの集合)を用いるXML文書へクラスのインスタンスを変換する方法を記述することによって,XML文書のクラスの表現を指定する。
XSL は,次のような段階で処理される。
最初の段階は, XSL変換 である。 ソースXMLを結果XML(XSLの“fo”名前空間)へ変換する。ツリー変換と共に,結果ツリーの構造はソースツリーの構造とは全く違うものにできる。結果ツリーの構成において,ソースツリーにフィルターをかけたり,再配置したりすることができる。さらに,任意の構造と生成した内容を追加できる。これが XSLT に相当する機能であり, XSL 規格の全体が決まる前にW3C勧告となった。
▲図1.1 ソースXMLのボキャブラリ変換
第二の段階は,XSLフォーマットの具体化である。 結果XML( XSL の“fo”)をXSLフォーマットオブジェクトと特性へ変換する。 文字列は文字フォーマットオブジェクト列へ変換され, 暗黙的方向は明示的な双方向マークへ導かれ, 複合の特性が作られる。 特性のあるもの,例えば“color”は,フォーマット結果を直接指定する。 別の特性,例えば“space-before”は,いかなる特定のフォーマット結果を指定することなく,可能なフォーマット結果の集合を強制するだけである。
▲図1.2 XSLフォーマットオブジェクトツリーの作成
第三の段階は,XSLフォーマットの詳細化である。 XSLフォーマットオブジェクトツリーは,反復的な型へ詳細化される。 特性の継承が解析され, 計算された値が処理され, 式が評価され, 複製された対応する特性が取り除かれる。
▲図1.3 XSLフォーマットオブジェクトツリーの詳細化
最後の段階は,幾何学的領域ツリーの生成である。 それらの領域は,一ページ以上の列に位置付けされる。 各々の幾何学的領域は,ページ上の位置,その領域で表示するものの指定,パディング,境界を持つ。
▲図1.4 幾何学的領域ツリーの生成
XSLT (XSL Transformations)は,XML文書を別の表現形式(フォーマット)へ変換(または変形)する機能であり, XSL の一部として設計された。ここでは, XSLT という用語は言語を指し, XSL変換 という用語はその機能を指すものとする。
XSLT 規格の要約では,次のように述べられている。
XSLT とは,XML文書を別のXML文書に変換するための言語である。
XSLT は,XML用のスタイルシート言語である XSL の一部として用いるために設計された。
XSL は, XSLT の他に,フォーマットを指定するためのXMLボキャブラリ(XMLのタグの集合)も含む。 XSL は,XML文書のスタイルを指定する際に,その文書をフォーマットボキャブラリ(フォーマットのためのタグの集合)を使用する別のXML文書へ変換する方法を, XSLT を用いて記述する。
XSLT は XSL から独立して使用できるようにも設計されている。 しかし, XSLT は完全に汎用的なXML変換用言語として用いるために設計されたわけではない。 むしろ設計の主眼は, XSL の一部として XSLT を用いる際に必要となる変換処理を行うことにある。
当初,電子文書関連規格の開発は,ISO(国際標準化機構)で進められ,次のような規格が開発されてきた。現在,これらはJIS(日本工業規格)となっている。
インターネットの登場によって,ほぼ同等の機能であるOSIの必要性が低くなった。さらに,ODAの複雑さから生じる実現の困難さが指摘された。そうしたことを背景にして,ODAに代わるネット交換向けの電子文書規格の必要性が高まった。
現在,電子文書規格の開発の中心は,ISOから非政府民間組織であるW3C(ワールドワイドウェブコンソーシアム)へと移り,次のような規格が開発されてきている。ちなみに,これらはJISではない。
▲図2.1 GMLからXML/XSLまでの開発の経緯
関連規格の開発史を通覧すると,一つに,規格の開発が情報産業の手に移ったことが分かる。もう一つは,マーク指定の規格(SGML,XML)に比べてスタイル指定の規格( DSSSL , XSL )が遅れることが分かる。それだけスタイル指定の一般化が困難であることを物語っている。
処理効率の面からも,XML文書を直接扱うことは少なく,何らかの表現形式へ変換する必要が生じるだろう。 XSL変換 の応用として,次の三つの処理モデルが考えられる。
サーバー処理モデルでは, XSLプロセッサー はC,Java,Perlなどで組まれたCGI(共通ゲートウェイインターフェース)から呼び出される。
▲図2.1 サーバー処理モデル
クライアント処理モデルでは, XSLプロセッサー はウェブブラウザーに内蔵される。変換結果のHTML文書は内部的に変換されるだけで直接見ることことができない。
▲図2.2 クライアント処理モデル
組版処理モデルでは, XSLプロセッサー はフォーマッターとして用いられる。
▲図2.3 組版処理モデル
簡単な「名刺」の文書型は,次のようになる。
<!ELEMENT meishi (simei,kaisyamei,zyusyo,denwabangou,logomark?)> <!ELEMENT simei (sei,mei)> <!ELEMENT sei (#PCDATA)> <!ELEMENT mei (#PCDATA)> <!ELEMENT kaisyamei (#PCDATA)> <!ELEMENT zyusyo (#PCDATA)> <!ELEMENT denwabangou (#PCDATA)> <!ELEMENT logomark EMPTY > <!ATTLIST logomark gazou CDATA #REQUIRED > |
この文書型が意味する構造は,次のようになる。
▲図3.1 「名刺」の構造
それに基づいて「名刺」を妥当なXML文書(インスタンス)として表すと,次のようになる。ちなみに,整形式のXML文書では文書型定義が省略される。
<?xml version="1.0" encoding="Shift_JIS" ?> <?xml-stylesheet type="text/xsl" href="MEISHI.XSL" ?> <!DOCTYPE meishi [ <!ELEMENT meishi (simei,kaisyamei,zyusyo,denwabangou,logomark?)> <!ELEMENT simei (sei,mei)> <!ELEMENT sei (#PCDATA)> <!ELEMENT mei (#PCDATA)> <!ELEMENT kaisyamei (#PCDATA)> <!ELEMENT zyusyo (#PCDATA)> <!ELEMENT denwabangou (#PCDATA)> <!ELEMENT logomark EMPTY > <!ATTLIST logomark gazou CDATA #REQUIRED > ]> <meishi> <shimei><sei>岸</sei><mei>和孝</mei></shimei> <kaisyamei>飯豊山書林</kaisyamei> <zyusyo>喜多方市松山町鳥見山字下堰下4608</zyusyo> <denwabangou>0241-22-3981</denwabangou> <logomark gazou="AIZU.GIF"/> </meishi> |
XSL変換 の結果では,次のようなHTML文書(インスタンス)を期待するものとする。
<HTML> <HEAD><TITLE>名刺</TITLE></HEAD> <BODY> <TABLE BORDER="1"><TR><TD> <P ALIGN="RIGHT">><IMG SRC="AIZU.GIF"></IMG></P> <P ALIGN="CENTER"><FONT SIZE="+2">岸 和孝</FONT></P> <P ALIGN="CENTER">飯豊山書林</P> <P ALIGN="CENTER">喜多方市松山町鳥見山字下堰下4608</P> </TD></TR></TABLE> </BODY> </HTML> |
このような XSL変換 を指示するスタイルシートは,次のようになる。このスタイルシートもまたXML文書であることに注目されたい。
<?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <HTML> <HEAD><TITLE>名刺</TITLE></HEAD> <BODY> <TABLE BORDER="1"><TR><TD> <xsl:if test="meishi/logomark"> <P ALIGN="RIGHT"> <IMG> <xsl:attribute name="SRC"> <xsl:value-of select="meishi/logomark/@gazou"/> </xsl:attribute> </IMG> </P> </xsl:if> <P ALIGN="CENTER"><FONT SIZE="+2"> <xsl:value-of select="meishi/shimei/sei"/> <xsl:value-of select="meishi/shimei/mei"/> </FONT></P> <P ALIGN="CENTER"><xsl:value-of select="meishi/kaisyamei"/></P> <P ALIGN="CENTER"><xsl:value-of select="meishi/zyusyo"/></P> </TD></TR></TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet> |
このスタイルシートでは,次のようにXMLコンテンツからHTMLコンテンツへ単純に対応付けしているだけである。
▲図3.2 XMLコンテンツ:HTMLコンテンツの対応
XSL に基づくスタイルシートは,次のようになる。1行目のxml宣言は,スタイルシートがShift-JISエンコーディングで表されていることを示している。2行目のスタイルシートの名前空間の指定“WD-xsl”は, XSL のW3C作業案に基づくことを示している。
<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> : 変換規則 : </xsl:stylesheet> |
一方, XSLT に基づくスタイルシートは,次のようになる。2行目のスタイルシートの名前空間の指定“XSL/Transform”は, XSLT のW3C勧告に基づくことを示している。
<?xml version="1.0" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> : 変換規則 : </xsl:stylesheet> |
XSLT の主要な変換規則は,次のとおりである。
▼表3.1 XSLTの主要な変換規則
| 変換規則 | 機能 |
|---|---|
| <xsl:template match="パターン"> 変換規則の並び </xsl:template> |
パターンで指定された要素が出現した場合に,その変換規則の並びを適用する。 |
| <xsl:value-of select="パターン"/> | パターンで指定された要素の内容をここに挿入する。 |
| <xsl:attribute name="属性名"> 属性値 </xsl:attribute> |
直前の要素に対して属性(属性名="属性値")を追加する。 |
| <xsl:if test="パターン"> 変換規則の並び </xsl:if> |
パターンで指定された要素が出現した場合,あるいはパターンの比較式が真である場合に,その変換規則の並びを適用する。 |
| <xsl:choose> when要素 : : otherwise要素 </xsl:choose> |
場合分けを表わす。 |
| <xsl:when test="パターン"> 変換規則の並び </xsl:when> |
パターンで指定された要素が出現した場合,あるいはパターンの比較式が真である場合に,その変換規則の並びを適用する。これは場合の数だけ指定する。 |
| <xsl:otherwise> 変換規則の並び </xsl:otherwise> |
whenのすべてに一致しない場合に,その変換規則の並びを適用する。 |
| <xsl:for-each select="パターン"> 変換規則の並び </xsl:for-each> |
パターンで指定された要素が反復して出現する度に,変換規則の並びを繰り返し適用する。 |
現在,数多くのXMLツールが存在する。SGML関連ツールに比べると,かなり多い。「XMLツールの開発の容易さ」というXMLの開発目標の一つが達成されたことが分かる。
XMLツールも,SGMLツールと同様に,Windows環境では充実しているが,MacOS環境では今回私の開発したもの以外には見るべきものはない。その理由として次のことが考えられる。なお,次期のOS XではJava対応が本格的に行われる,と発表されている。
▼表3.1 Windows環境におけるXSLツール
| プログラム名 | 機能 | 開発者(移植者) | 開発言語 |
|---|---|---|---|
| XT | XSLプロセッサー | James Clark | java |
| XT for Win32 | XSLプロセッサー | James Clark | Java,C |
| Internet Explorer 5 | ウェブブラウザー | Microsoft社 | |
| InDelv XML Client | ウェブブラウザー | InDelv社 | |
| その他 |
▲図3.1 Windows環境におけるXSLツール
▼表3.2 MacOS環境におけるXSLツール
| プログラム名 | 機能 | 開発者(移植者) | 開発言語 |
|---|---|---|---|
| TransforMiiX | XSLプロセッサー | Keith Visco(岸 和孝) | C |
| XSLTC | XSLTスタイルシートコンパイラー | Olivier Gerardin(岸 和孝) | C |
| Internet Explorer 5 | ウェブブラウザー | Microsoft社 | |
| InDelv XML Client | ウェブブラウザー | InDelv社 | |
| toU/fromU | Shift-JIS〜UTFテキストコンバーター | 岸 和孝 | C |
| その他 |
▲図3.2 MacOS環境におけるXSLツール
現在広く利用されているMicrosoft Internet Explorer 5(通称,IE5)は, XSLプロセッサー を内蔵した,クライアント処理モデル向けのXML/XSL対応ウェブブラウザーである。このツールは,WindowsとMacOSの両環境においてほぼ同じ動作を実現している。
IE5では,日本語はUTFエンコーディングおよびShift-JISエンコーディングが共に入力できる。さらに,XML viewer機能を備えているので,スタイルシート制作に便利なツールである。
▲図3.1 Internet Explorer 5
InDelv XML Clientは, XSLプロセッサー を内蔵した,クライアント処理モデル向けのXML/XSL対応ウェブブラウザーである。IE5が XSL変換 だけを実現しているのに対して,InDelv XML Clientは XSL の機能(すなわち, XSL変換 と XSLフォーマッター の両方の機能)を実現している。また,WindowsとMacOSの両環境においてほぼ同じ動作を実現している。バージョンはまだ0.6であるが,オープンソースなので,今後のバージョンアップが期待できよう。
ブラウザーの頒布は自由であるが,エディターは商用製品扱いとなっている。
XSLフォーマットオブジェクトを用いたスタイルシートは,前述の「名刺」の例では,次のようになる。InDelv XML ClientのUTFエンコーディングに問題があるのか,日本語の表示がおかしいことや,利用可能なXSLフォーマットオブジェクトの種類が限られていることから,このスタイルシートの動作は十分に確認できていない。
<xsl:stylesheet
xmlns:xsl='http://www.w3.org/XSL/Transform/1.0'
xmlns:fo='http://www.w3.org/XSL/Format/1.0'
result-ns='fo'>
<xsl:template match="/">
<fo:block start-indent="20pt"
margin-top="2pt" margin-bottom="2pt"
margin-left="2pt" margin-right="2pt">
<fo:table border-style="solid"
table-width="60%">
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block space-before="10pt"
start-indent="230pt">
<fo:display-graphic href="{meishi/logomark/@gazou}" />
</fo:block>
<fo:block space-before="10pt"
font-size="18pt"
start-indent="100pt">
<xsl:value-of select="meishi/shimei/sei"/>
 
<xsl:value-of select="meishi/shimei/mei"/>
</fo:block>
<fo:block space-before="10pt"
font-size="14pt"
start-indent="90pt">
<xsl:value-of select="meishi/kaisyamei"/>
</fo:block>
<fo:block space-before="10pt"
font-size="12pt">
<xsl:value-of select="meishi/zyusyo"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</xsl:template>
</xsl:stylesheet>
|
現在広く利用されているXTは,サーバー処理モデル向けの,Javaから呼び出し可能な XSLプロセッサー である。このツールは,Windows環境においてのみ動作する。XTをWindowsのMS-DOSウィンドウで動作可能にしたXT for Win32は,IE5のMSXML Java VMを利用して動作する。XT(for Win32)では,日本語はUTFエンコーディングだけしか入力できない。
▲図3.1 XT
TranforMixxは,サーバー・クライアントの二つの処理向けの,Cから呼び出し可能な XSLプロセッサー である。このツールは,現在,Mozillaプロジェクトで開発が進められている。今までWindows環境においてのみ動作可能であったが,今回MacOS環境へ移植した。
TranforMixxでは,日本語はUTFエンコーディングだけしか入力できないので,MacOS環境での利用の便宜を図るために,Shift-JIS〜UTFテキストコンバーターも合わせて開発した。
▲図3.1 TranforMixx
各種の XSLプロセッサー の機能は,次のような実現状況である。
▼表3.1 XSL要素の実現状況
| XSL要素 | 機能 | W3C XSL 1.0 | MSXML 2.0 (IE5) |
MSXML 3.0 (may 2000) |
XT 19991105 |
TransforMiix 1.0 |
|---|---|---|---|---|---|---|
| apply-imports | テンプレートの取り込み | X | X | x | x | |
| apply-templates | テンプレートの呼び出し | X | X | X | X | X |
| attribute | 属性値への置換 | X | X | X | X | X |
| attribute-set | 名前付き属性の集合 | X | X | X | X | |
| call-template | テンプレートの呼び出し | X | X | X | X | |
| choose | 場合分けの前書き | X | X | X | X | X |
| comment | 注釈の生成 | X | X | X | X | X |
| copy | コピー | X | X | X | X | X |
| copy-of | コピー | X | X | X | X | |
| decimal-format | 数字の様式 | X | X | x | X | |
| element | 要素の生成 | X | X | X | X | X |
| fallback | フォールバック | X | - | - | ||
| for-each | 条件による反復 | X | X | X | X | X |
| if | 条件による選択 | X | X | X | X | X |
| import | スタイルシートのインポート | X | X | X | X | |
| include | スタイルシートのインクルード | X | X | X | X | |
| key | キーの宣言 | X | - | - | ||
| message | メッセージ | X | X | X | ||
| namespace-alias | 名前空間URIのエイリアス宣言 | X | X | X | ||
| number | 番号付け | X | X | X | X | |
| otherwise | 場合分けの省略時 | X | X | X | X | X |
| output | 出力 | X | X | x | X | |
| param | パラメータ | X | X | X | X | |
| preserve-space | 空白の保存 | X | X | X | X | |
| processing-instruction | 処理命令 | X | X | X | X | X |
| sort | 分類 | X | X | X | X | |
| strip-space | 空白の削除 | X | X | X | X | |
| stylesheet | スタイルシートの前書き | X | X | X | X | X |
| template | テンプレートの前書き | X | X | X | X | X |
| text | テキストの生成 | X | X | X | X | X |
| transform | スタイルシートの前書き | X | X | X | X | |
| value-of | 要素の内容への置換 | X | X | X | X | X |
| variable | 変数 | X | X | X | X | |
| when | 場合分けの条件 | X | X | X | X | X |
| with-param | テンプレートへのパラメータの引き渡し | X | X | X | X |
▼表3.2 XSL関数の実現状況
| XSL関数 | 機能 | W3C XSL 1.0 | MSXML 2.0 (IE5) |
MSXML 3.0 (may 2000) |
XT 19991105 |
TransforMiix 1.0 |
|---|---|---|---|---|---|---|
| current | カレントノード | X | X | X | X | |
| document | ソース文書 | X | x | x | ||
| element-available | 利用可能な要素 | X | X | - | X | |
| format-number | 数字の様式 | X | X | x | - | |
| function-available | 利用可能な関数 | X | X | X | X | |
| generate-id | ノード | X | X | X | X | |
| key | キー | X | - | - | ||
| system-property | システム特性の値 | X | X | X | - | |
| unparsed-entity-url | 構文解析対象外実体のURI | X | X | - |
XML文書からHTMLコンテンツへの変換は,現状の各種の XSLプロセッサー で十分対応できる状況にあるので,容易であろう。
HTMLコンテンツとして段階スタイルシート(CSS)をHTMLファイル内に含めるか,別のファイルとして独立させるか,は任意である。ここでは,HTMLタグでのスタイル指定ができない箇所をCSSで補完させる形をとった。
この文書はXMLで表現してある。TransforMiixによってHTML文書に変換し, XSL変換 を確認した。使用したデータは次のとおりであった。
▼表4.1 HTMLコンテンツへの変換のためのデータ
| 内容 | ファイル名 |
|---|---|
| この文書(XMLインスタンス) | SEMINAR.XML |
| この文書の文書型定義 | REPORT.DTD |
| REPORT.DTDのためのスタイルシート | REPORT.XSL |
| この文書のXSL変換結果(HTMLインスタンス) | SEMINAR.HTM |
TransforMiixによる XSL変換 の手順は次のとおりであった。
現状の各種の XSLプロセッサー を使って,XML文書からPageMaker,QuakXpress,TeX,FrameMakerなどといった組版データへの変換が処理可能かどうかの判断は現段階では難しい。
現時点では,InDelv XML Clientでは,利用可能なXSLフォーマットオブジェクトの種類が限られている。また,TransforMiixでは,出力メソッドで実現されていない機能があり,XTで実装されている拡張要素や拡張関数が無かった。そうしたことから,スタイルシートの動作確認ができなかった。
組版データへの変換では, XSL変換 のテキスト出力メソッドを用いることになるが,組版データにおけるエスケープは様々な形式であり,何らかの拡張関数が必要になるかもしれない。そうした意味からは, XSL変換 前後の処理がプログラミングできる,JavaベースのXTを利用した方がいいかもしれない。
印刷業では,「HTMLコンテンツ制作ビジネス」の延長線上に「XMLコンテンツ制作ビジネス」を期待する傾向が見られるが,果たして「XMLコンテンツ制作ビジネス」があるのだろうか,と思う。 つまり,XMLはデータベースの動的情報を運ぶコンテナーであり,「XMLコンテンツ制作」だけが切り出されてアウトソーシングされるとは思われないからである。
「XMLコンテンツ制作ビジネス」をサービスする場合は, XSLT だけではなく, XSL 規格を利用したスタイルシートの制作,そしてデータベース操作を前提としたJavaやPerlなどのプログラミング技術も要求されるだろう。
XSL は DSSSL にかなり近い機能である。組版については, XSL変換 の工夫も大事であるが, XSL の機能が実現されるまでは, DSSSL を学ぶべきだろう。ちなみに, XSL と DSSSL との対比に関する論文はないようである。また, XSL から DSSSL への変換もないようである(Henry S. Thompsonによるxsljは XSL 規格のバージョンが古すぎるので使えない)。 通常の紙媒体を前提にした印刷物を組版できるXSLツールが登場するという保証は無い。つまり,ベンダーにおける開発が電子媒体上での「組版」へ集中するかもしれないからである。
小文では,商用製品については触れることができなかった。評価に割く時間がないことと,評価できるだけの材料を持ち合わせていないことが最大の理由である。機会を得て評価結果を発表したいと思う。
参考文献およびインターネットサイト