CALSのテーブルとオーサリングツール

たまたまお客様から問い合わせがあってわかったのですが、DITAのテーブルの処理はオーサリングツールや出力によって様々なようです.

試しにサンプルを作ってみました.次のような少々変なテーブルのデータです.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
<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の仕様どおりではありません.

イメージ 1


XMetaL 8では、ちゃんと"CELL22"の周りには罫線が引かれ、他のセルは破線で罫線なしを示しています.お利口さんでした.最近XMetaLはoXygenに先を越されていると思うことが多々あったのですが、ここでは勝っていました!!!

イメージ 2


ではPDF出力はどうでしょうか?DITA-OTのPDF2出力だと次のようになります.

イメージ 3

ところがXMetaLのPDF出力ではセルの罫線がみんな表示されてしまいます.XMetaLのPDF出力はJUST SYSTEMSがDITA-OTのをカスタマイズしているのですが、どうもちゃんとCALSのテーブルをインプリメントしていないようです.せっかくGUIの表示を頑張ってやっているのにこれは残念です.

イメージ 4

ちなみにPDF5での出力は以下のようになります.

イメージ 5


元々オーサリングツールはXMLをどう表示し編集するかに全力をあげています.なのでバンドルされている、DITA-OTの出力はどちらかと言えばオマケです.プロダクションユースになりようがありません.でもやはりお客様はオーサリングしただけではなかなか安心できるものではありません.PDFに出して確認してみたいものです.そんなとき、XMetaLのPDF出力はちょっと残念でした.スタイルシートの問題なので、もし時間があったら見てみたいと思います.

※ やってみました.⇒XMetaLのPDF出力で不要な罫線が出てしまうのはどうもJUST SYSTEMSのカスタマイズのミスのようです.JUST SYSTEMSのカスタマイズしたスタイルシートを二箇所修正したら仕様どおりに出るようになりました.

イメージ 6
修正した箇所は

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 ')]