ファイルの入出力で便利になったのが、<xs:result-document>による複数の出力ファイルのサポートです.XSL1.0では、入力ファイルについてはdocument()関数を使って、任意のXMLファイルを入力できました.
と値を取得することもできましたし、
<xsl:apply-templates select="document('lang.xml')/doc"/>
と、テンプレートを適用することもできました.これらの機能は、スタイルシートの変換に関する補助的な情報を取得するためによく使用したものです.
さて、<xsl:result-document>はどのような機能をもっているでしょうか?パラメータを見るとまさに本格的です.
- @formatで<xsl:output>のname属性で指定した名前を指定する.(指定した<xsl:output>に従ってシリアライズされる)
- @hrefで出力ファイルを指定する.
- @methodでxml、html、xhtml、textを指定する.この値に応じてシリアライズされる.
- @doctype-public、@doctype-systemで文書型宣言を指定する.
- @encodingでエンコーディングを指定する.
- @hrefで出力ファイルを指定する.
- @methodでxml、html、xhtml、textを指定する.この値に応じてシリアライズされる.
- @doctype-public、@doctype-systemで文書型宣言を指定する.
- @encodingでエンコーディングを指定する.
などと、ほとんど<xsl:output>と同じ属性を持っています.
<xsl:result-document>は、DocBookで書いたような大きな入力文書を、小さな単位に分割してHTMLにしたりする場合に便利でしょう.以下のようにすれば、chapter単位にXHTMLファイルが作れます.
<xsl:template match="chapter">
<xsl:variable name="title" as="xs:string">
<xsl:variable name="tempTitle" as="xs:string*">
<xsl:apply-templates select="title" mode="TEXT_ONLY"/>
</xsl:variable>
<xsl:sequence select="string-join($tempTitle,'')"/>
</xsl:variable>
<xsl:result-document href="{concat($title,'.htm')}"
method="xhtml"
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
encoding="UTF-8"
omit-xml-declaration="no">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><xsl:copy-of select="$title"/></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:result-document>
</xsl:template>
<xsl:variable name="title" as="xs:string">
<xsl:variable name="tempTitle" as="xs:string*">
<xsl:apply-templates select="title" mode="TEXT_ONLY"/>
</xsl:variable>
<xsl:sequence select="string-join($tempTitle,'')"/>
</xsl:variable>
<xsl:result-document href="{concat($title,'.htm')}"
method="xhtml"
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
encoding="UTF-8"
omit-xml-declaration="no">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><xsl:copy-of select="$title"/></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:result-document>
</xsl:template>
問題はファイル名をファイルシステム上で問題なく決めるアルゴリズムくらいでしょうか?それにしても、やろうとすれば、1つのXMLファイルから、XMLファイルだけでなく、HTMLファイルやtextファイルだって同時に作れてしまうというのはすごい機能です.
こんどDITA Open Toolkitの中間ファイルから、あるターゲットのXMLを生成するとき、この機能が使えるのではないか?と検討しています.