たまたまお客様から問い合わせがあってわかったのですが、DITAのテーブルの処理はオーサリングツールや出力によって様々なようです.
試しにサンプルを作ってみました.次のような少々変なテーブルのデータです.
<concept id="concept_ab01c">
<title>Table colsep/rowsep test</title>
<shortdesc/>
<conbody>
<table frame="none" id="table_ff01c">
<tgroup cols="3" colsep="0" rowsep="0">
<colspec colname="c1" colnum="1" colwidth="1*"/>
<colspec colname="c2" colnum="2" colwidth="1*"/>
<colspec colname="c3" colnum="3" colwidth="1*"/>
<tbody>
<row>
<entry>CELL11
</entry>
<entry rowsep="1">CELL12
</entry>
<entry>CELL13
</entry>
</row>
<row>
<entry colsep="1">CELL21
</entry>
<entry rowsep="1" colsep="1">CELL22
</entry>
<entry>CELL23
</entry>
</row>
<row>
<entry>CELL31
</entry>
<entry>CELL32
</entry>
<entry>CELL33
</entry>
</row>
</tbody>
</tgroup>
</table>
</conbody>
</concept>
tableでframe="none"を指定しています.なので表の一番外側の罫線は四方ともなしです.tgroupでcolsep="0" rowsep="0"を指定しています.これは以下の階層のentryで右側罫線と下側罫線を引かないことを既定にしています.その上で、"CELL22"を内容とするセルには四方に罫線を引きます.これがオーサリングツールでどう表示されるか試してみました.
oXygen 15.0では、セルは全部罫線なしになってしまいました.これはイマイチです.CALSの仕様どおりではありません.
XMetaL 8では、ちゃんと"CELL22"の周りには罫線が引かれ、他のセルは破線で罫線なしを示しています.お利口さんでした.最近XMetaLはoXygenに先を越されていると思うことが多々あったのですが、ここでは勝っていました!!!
ではPDF出力はどうでしょうか?DITA-OTのPDF2出力だと次のようになります.
ところがXMetaLのPDF出力ではセルの罫線がみんな表示されてしまいます.XMetaLのPDF出力はJUST SYSTEMSがDITA-OTのをカスタマイズしているのですが、どうもちゃんとCALSのテーブルをインプリメントしていないようです.せっかくGUIの表示を頑張ってやっているのにこれは残念です.
ちなみにPDF5での出力は以下のようになります.
元々オーサリングツールはXMLをどう表示し編集するかに全力をあげています.なのでバンドルされている、DITA-OTの出力はどちらかと言えばオマケです.プロダクションユースになりようがありません.でもやはりお客様はオーサリングしただけではなかなか安心できるものではありません.PDFに出して確認してみたいものです.そんなとき、XMetaLのPDF出力はちょっと残念でした.スタイルシートの問題なので、もし時間があったら見てみたいと思います.
※ やってみました.⇒XMetaLのPDF出力で不要な罫線が出てしまうのはどうもJUST SYSTEMSのカスタマイズのミスのようです.JUST SYSTEMSのカスタマイズしたスタイルシートを二箇所修正したら仕様どおりに出るようになりました.
修正した箇所は
C:\Users\[ユーザ名]\AppData\Roaming\SoftQuad\XMetaL Shared\DITA_OT\plugins\xmfo\Customization\fo\xsl\xm_tables.xslの以下の箇所です.
Line 123
<xsl:if test="not(string($rowsep)) and *1">
<xsl:call-template name="processAttrSetReflection">
<xsl:with-param name="attrSet" select="$entryHorizontalBorder"/>
<xsl:with-param name="path" select="$tableAttrs"/>
</xsl:call-template>
</xsl:if>
Line 149
<xsl:if test="not(string($colsep)) and following-sibling::*[contains(@class, ' topic/entry ')]">
<xsl:call-template name="processAttrSetReflection">
<xsl:with-param name="attrSet" select="$entryVerticalBorder"/>
<xsl:with-param name="path" select="$tableAttrs"/>
</xsl:call-template>
</xsl:if>
他に影響があるかもしれませんので、もし修正されるようでしたらご自分の責任でお願いします.
*1:../following-sibling::*[contains(@class, ' topic/row ')]) or (../parent::node()[contains(@class, ' topic/tbody ')] and ancestor::*[contains(@class, ' topic/tgroup ')][1]/*[contains(@class, ' topic/tfoot ')]