CCMSのプラットフォームとXSLTスタイルシート

今まで山ほどDITAのXSLTスタイルシートを書いてきましたが、その主なプラットフォームはWindowsでした.もちろんお客様の中にはCCMSを導入していない場合もありますが、導入している場合はそのプラットフォームはWindowsでした.
つまり、手元のWindows 10でスタイルシートを書いて試験して、それがお客様のWindowsマシンかCCMSのパブリッシングサーバーでもすぐ動いてくれたのです.
でもこの頃はCCMSは競争が大変ですね.Windows だけではなく、この頃はLinuxプラットフォームのCCMSも増えてきました.でもWindowsにしてもLinuxにしても、XSLTスタイルシートは同じではないのでしょうか?
実は違ったのです.結構痛い目に遭いました.こんなストーリーです.

  1. DITAのマップの中にトピックだけでなく、様々なXMLのリソースを記述してスタイルシートで使用します.例えばターゲットの国特有の共通言語リソースなど.
  2. このようなものはDITAではないXMLに記述するので、で記述します.
  3. でもこのようなtopicrefはPDFを作る前のマージ後中間ファイルでは綺麗に消え去ってしまいます.リソースなので要らないと言う訳です.
  4. このため、リソースファイルを使用するには、自前でマップを読んで、その在りかを記憶しておく必要があります(ANTのプロパティにです)これをスタイルシートのパラメータとして@hrefを渡してやります.

DITAのマップ@hrefはURIです.でもCMSの場合、パブリッシュの時はフラットな空間になんでもチェックアウトされてしまうので、ファイルURIではなくパスですね.
そして多くの場合、スタイルシートではこれらのリソースをdoc()で読み込もうとします.doc()のパラメータはURIなので、XSLTのresolve-uri()関数でURIを作ってやるんですが、実はこの結果がWindowsLinuxで異なります.

  • Windowsは"file:/"で始まります.
  • Linuxは"file://"で始まります.

そして、結果をdoc()に渡すと、Windowsはそのdocument-nodeを返してくれますが、Linuxはエラーになってしまいます.止む無く、"file://"をなんとか"file:/"にスタイルシートで直すとちゃんと通ります.

XSLTなのでプラットフォーム共通と思っていたのですが、思わぬところにトラップがありました.覚えておいて損はありません.