Entry

テキストとして XInclude すると CR がエンティティになってしまう件

2012年04月27日

Docbook XML 5.0 は XInclude をサポートしているので,プログラムのリストを書くときに外部ファイルをテキストとして読み込むことができます。XInclude にある parse 属性に text を指定すると XSLT で (X)HTML に変換するとき,エンティティの変換までしてくれるのでとても便利です。ソースをそのまま取り込めばいいので,自前でコピペするようなショボいことをしなくていい。

しかし,xsltproc で XInclude を有効にすると,テキストファイルのパース時にどうしても CR(0x0D)のエンティティが付加されてしまいます。これが XInclude の仕様なのか,まだしっかり調べてないのだけれども,同じ問題で困っている人はそれなりにいるみたい。XSL-FO に変換する場合は,white-space-treatment 属性を preserve にすることで回避できるみたいだけれども,(X)HTML の場合はどうも無理目……。xsltproc だけでなく,Saxon でも同じ現象があるようです。

で,ま,しょうがないので,XSLT の出力時,強制的にエンティティを削除することにしました。

  <xsl:template match="d:programlisting">
    <pre><code><xsl:value-of select="translate(./text(),'&#13;','')"/></code></pre>
  </xsl:template>

一応,これで回避できた。しかし,やり方としては乱暴です。個人的に使用する限りにおいて,XInclude をテキストとして使うのは programilisting くらいなので,これでいいっちゃいいんだけれども,汎用性はありません。

Docbook XSL はどうやってるんだろ。こっちを見るのが先だったか。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN