曲者 ">"

XMLでは、"<"はタグを開始し、">"はタグを閉じるのに使います.ですから、XMLでこれらの文字をタグ以外の目的でテキスト中などで使いたいときは、&amp;lt;、&amp;gt;の実体参照で使います.でもここで要注意なのは">"です.タグを閉じるこの文字は、ふつうのテキスト中でもスタイルシートの中でもエラーなしで使えてしまうのです.本当でしょうか?
 
例えばこんなXMLも有効なウェルフォームド文書です.IEでちゃんと見れます.
<?xml version="1.0" encoding="UTF-8"?>
<data>></data>
 
私は">"で今まで3回ほど痛い目にあいました.例えば次のようなスタイルシートがあります.

<xsl:template match="*[contains(@class, ' topic/topic ')]">
    <xsl:variable name="lang" as="xs:string">
     ...
    </xsl:variable>>
    <fo:block>
     ...
    </fo:block>
</xsl:template>
 
</xsl:variable>の隣に余計な">"が入っています.でもoXygenではエラーになりません.エラーになるのは、これから生成したXSL-FOをフォーマットするときです.
 
このテンプレートの上位ではfo:flowを生成するので、">"をエラーとして検出します.
 
     [exec] AHFCmd :WARNING: Unexpected text: '>' in 'fo:flow'.
 
でもこれだと何がなんだかわかりません.原因にたどり着くには少し時間がかかりました.そしてタイプミスにがっかりしたものです.
 
対策は、たとえxsl:templateでもasを記述することです.例えば上記のテンプレートは要素しか生成しないはずです.ですから
 
<xsl:template match="*[contains(@class, ' topic/topic ')]" as="element()*">
 
とします.そうするとXSLTの実行時にちゃんとエラー検出してくれます.
 
[xslt] D:\DITA-OT1.5.3\plugins\xx_pdf\xsl\xx_dita2fo_maincontent.xsl:693: Fatal Error! Required item type of result of template match="*[contains(@class, ' topic/topic ')]" is element(); supplied value has item type text()
 
これは、テンプレートの戻り値にelement()でないtext()が含まれているとしてエラーにしてくれています.
 
XSLT1.0ではテンプレートの戻り値なんて考えもしなかったのですが、ようやくXSLT2.0の関数にはasをつけるようになりました.そこで更に、関数以外のテンプレートにもつけるとより厳格にスタイルシートを作れるようになります.
 
まだversion="2.0"としてあっても、たまに変数にすらas属性をつけていないスタイルシートをよく見かけます.まず変数から始めて、テンプレートにもas属性をつける習慣にしてゆけばエラーが起こってもすぐわかるようになります.