閑話休題: XSL-FOとホワイトスペース

DITAなのですがお客様で日本語と英語を同じファイルでオーサリングしている方がいらっしゃいました.
 
ルート要素はditaで中に日英二つのtopicが存在します.両方ともコンディショナルがかかっていて、英語をpublishingしたいときと日本語をpublishingしたいときとで.ditavalでフィルタリングして使い分けています.小規模なドキュメントのときはCMSなんて使わなくてもこれで結構いけるのです.
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dita PUBLIC "-//OASIS//DTD DITA Composite//EN" "ditabase.dtd">
<dita>
  <topic props="en-us" id="...">
    ...
  </topic>
  <topic props="ja" id="...">
    ...
  </topic>
</dita>

2言語一緒なので同じXMLエディタをつかっていると思うのですが、日本語がうまく行かない余計なスペースが入ってしまうのでなんとかして欲しいという要望がありました.具体的には
 
△△△<p>
△△△これは段落です、途中で△△△[U+000A]
△△△改行で区切られています.
△△△</p>
 
というイメージです.ここで△は空白、[U+000A]は改行です.ここの「途中で」と「改行で」の間に組版すると1スペース分の空白が残ってしまうのです.これをなんとかしてくれという要望です.確かにoXygenをつかっても、空白はバンバン入ってしまいます.
 
英語の場合は日本語と異なり単語間の空白がありますから、単語の区切りでどんどん改行を入れてなんの問題もないのですが、日本語はあたりまえですが単語間に空白を置くことをしません.
 
そういえばそもそもあまり気にしなかった空白(やU+000D、U+000A、U+0009などのホワイトスペース)ですが、デフォルトでXSL-FOは問題なく処理してくれています.
 
XSL-FOでのホワイトスペースの扱いは、white-space-treatmentとwhite-space-collapseとlinefeed-treatmentいうプロパティです.
 
 
このデフォルト値はwhite-space-treatment="ignore-if-surrounding-linefeed"、white-space-collapse="true"、linefeed-treatment="treat-as-space"になっています.この意味は、U+000Aは空白に変換され、連続する空白は1つの空白になり、行の先頭と末尾の空白は除去されます.
 
英語はこれで十分です.でも日本語では組版結果は、「これは段落です、途中で△改行で区切られています.」になって空白が一個残ってしまいます.これはいろいろプロパティをいじくってもどうしようもありません.white-space-treatment="ignore"、linefeed-treatment="ignore"なんかにしちゃうと意図的に入れた空白まで消えちゃいます.結局お客さんは日本語の段落の場合は無用な空白を入れないようにしたようです.
 
便利なXMLエディタですがさすがに言語の違いまでは面倒を見てくれません.日本語の場合は気をつけないいけないですね.