標準情報(TR) TR X 0059:2002

XSLTライブラリ

XSLT Library

序文

この標準情報(TR)は,2000〜2001年度における(財)日本規格協会 情報技術標準化研究センター(INSTAC)の電子出版技術調査研究をもとに工業標準化の促進に関連して特に重要と判断される技術情報をまとめ,標準情報(TR)タイプUとして公表するものである。


1. 適用範囲

この標準情報(TR)は, XML文書に対する変換処理を共有する手段としてのXSLTライブラリを規定する。変換対象のXML文書における文書構造要素はXPathによって制限し, 変換先はHTML文書とする。


2. 引用規定

次に示す規格等は, この標準情報(TR)に引用されることによって, この標準情報(TR)の規定の一部を構成する。これらの引用規定は, その最新版を適用する。

TR X 0048:2001, XSL変換(XSLT) 1.0

TR X 0008:1999, 拡張可能なマーク付け言語(XML) 1.0

XML Path Language (XPath) Version 1.0, W3C Recommendation, 1999-11-16, http://www.w3.org/TR/1999/REC-xpath-19991116

JIS X 4156:2000, ハイパテキストマーク付け言語(HTML)


3. 定義

a) XSLTライブラリ 特定の用途のために記述されたXSLT記述の集合。XSLT記述の中のパラメタ及び変数を変更することによって, 利用環境への適合を行う。


4. 機能

XSLT処理系でXML文書を変換処理するためのXSLTライブラリは, 処理後の用途に応じて提供される。ここでは,次に示すXSLT処理の変換機能を扱う。

4.1 目次の生成

目次の生成機能を, XSLTライブラリとして提供する。

ライブラリ本体である5.1 a)のXSLT指定は, 次の手順によって使用される。

a) ライブラリの名前空間を指定する。
    xmlns:xsltlib="http://jsa.or.jp/xsltlib"

b) ライブラリをインポートする。
    <xsl:import href="xsltlib_toc.xsl"/>

c) 目次に含めたい要素を, XPathを使って, 変数xsltlib:toc_entの値に指定する。
    <xsl:variable name="xsltlib:toc_ent" select="//chapter/title | //section/title"/>
   この指定を省略すると, 変数xsltlib:toc_entのデフォルト値として, サンプルインスタンスの中の任意の場所にあるchapter要素の子要素であるtitle要素が用いられる。

d) 目次を生成したい場所で, 名前付きテンプレートxsltlib:xslt_lib_tocを呼び出す。
    <xsl:call-template name="xsltlib:xslt_lib_toc"/>

このライブラリの使用例を, 5.1 b)に示す。変数xsltlib:toc_entの値として, サンプルインスタンスの中の任意の場所にあるchapter要素の子要素であるtitle要素, 及び任意の場所にあるsection要素の子要素であるtitle要素を指定することによって, これらの内容が名前付きテンプレートxsltlib:xslt_lib_tocを呼び出した場所に挿入される。

4.2 索引の生成

索引の生成機能を, XSLTライブラリとして提供する。

ライブラリ本体である5.2 a)のXSLT指定は, 次の手順によって使用される。

a) ライブラリの名前空間を指定する。
    xmlns:xsltlib="http://jsa.or.jp/xsltlib"

b) ライブラリをインポートする。
    <xsl:import href="xsltlib_index.xsl"/>

c) 索引に含めたい要素(索引項目)と, そこから参照したい要素とを, XPathを使って, 変数xsltlib:index_ent及びxsltlib:index_refの値に指定する。
    <xsl:variable name="xsltlib:index_ent" select="//term | //term1"/>
    <xsl:variable name="xsltlib:index_ref" select="//title"/>
   この指定を省略すると, 変数xsltlib:index_entのデフォルト値として, サンプルインスタンスの中の任意の場所にあるterm要素が, またxsltlib:index_refのデフォルト値として, サンプルインスタンスの中の任意の場所にあるtitle要素が用いられる。

d) 索引を生成したい場所で, 名前付きテンプレートxsltlib:xslt_lib_indexを呼び出す。
    <xsl:call-template name="xsltlib:xslt_lib_index"/>

このライブラリの使用例を, 5.2 b)に示す。変数xsltlib:index_entの値として, サンプルインスタンスの中の任意の場所にあるterm要素, 及び任意の場所にあるterm1要素を指定し, xsltlib:index_refの値として, サンプルインスタンスの中の任意の場所にあるtitle要素を指定することによって, 名前付きテンプレートxsltlib:xslt_lib_indexを呼び出した場所に索引が挿入される。索引項目は単純にソートされる。このとき, 索引項目が同じ場合は1つにまとめられる。また, 個々の索引項目に対応する要素としては, その索引項目に対して共通の親をもつ要素のうち逆文書順でもっとも近いものが選ばれる。


5. ライブラリ

5.1 目次の生成

a) 目次生成ライブラリ (xsltlib_toc.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib" version="1.0"> <xsl:variable name="xsltlib:toc_ent" select="//chapter/title"/> <xsl:template name="xsltlib:xslt_lib_toc"> <xsl:for-each select="$xsltlib:toc_ent"> <xsl:value-of select="."/><br/> </xsl:for-each> </xsl:template> </xsl:stylesheet>

b) 目次生成ライブラリの使用 (toc.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib" version="1.0"> <xsl:import href="xsltlib_toc.xsl"/> <xsl:variable name="xsltlib:toc_ent" select="//chapter/title | //section/title"/> <xsl:template match="document"> <html> <head> <title><xsl:value-of select="title"/></title> </head> <body> <xsl:apply-templates select="title"/> <hr/> <xsl:call-template name="xsltlib:xslt_lib_toc"/> <hr/> <xsl:apply-templates select="chapter"/> <hr/> </body> </html> </xsl:template> <xsl:template match="title"> <h1><xsl:value-of select="."/></h1> </xsl:template> <xsl:template match="chapter"> <h2><xsl:value-of select="title"/></h2> <p><xsl:apply-templates select="p"/></p> <xsl:apply-templates select="section"/> </xsl:template> <xsl:template match="section"> <h3><xsl:value-of select="title"/></h3> <p><xsl:apply-templates select="p"/></p> <xsl:apply-templates select="sub-section"/> </xsl:template> <xsl:template match="sub-section"> <b><xsl:value-of select="title"/></b> <p><xsl:apply-templates select="p"/></p> <xsl:apply-templates select="list"/> </xsl:template> <xsl:template match="p"> <xsl:if test="position() != 1"><br/> </xsl:if> <xsl:value-of select="."/> </xsl:template> <xsl:template match="list"> <ul><xsl:apply-templates select="item"/></ul> </xsl:template> <xsl:template match="item"> <li><xsl:value-of select="."/></li> </xsl:template> </xsl:stylesheet>

5.2 索引の生成

a) 索引生成ライブラリ (xsltlib_index.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib" version="1.0"> <xsl:variable name="xsltlib:index_ent" select="//term"/> <xsl:variable name="xsltlib:index_ref" select="//title"/> <xsl:template name="xsltlib:xslt_lib_index"> <xsl:for-each select="$xsltlib:index_ent"> <xsl:sort select="."/> <xsl:choose> <xsl:when test=".=preceding::*[count(.|$xsltlib:index_ent)=count($xsltlib:index_ent)]"> <xsl:text>, </xsl:text> </xsl:when> <xsl:otherwise> <xsl:if test="not(position()=1)"> <br/> </xsl:if> <xsl:value-of select="."/> <xsl:text>..........</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:apply-templates select="ancestor::*[child::*[count(.|$xsltlib:index_ref)=count($xsltlib:index_ref)]][1]" mode="xsltlib:indexref"/> <xsl:if test="position()=last()"> <br/> </xsl:if> </xsl:for-each> </xsl:template> <xsl:template match="*" mode="xsltlib:indexref"> <xsl:value-of select="*[count(.|$xsltlib:index_ref)=count($xsltlib:index_ref)]"/> </xsl:template> </xsl:stylesheet>

b) 索引生成ライブラリの使用 (index.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib" version="1.0"> <xsl:import href="xsltlib_index.xsl"/> <xsl:variable name="xsltlib:index_ent" select="//term | //term1"/> <xsl:variable name="xsltlib:index_ref" select="//title"/> <xsl:template match="document"> <html> <head> <title><xsl:value-of select="title"/></title> </head> <body> <xsl:apply-templates select="title"/> <hr/> <xsl:apply-templates select="chapter"/> <hr/> <xsl:call-template name="xsltlib:xslt_lib_index"/> <hr/> </body> </html> </xsl:template> <xsl:template match="title"> <h1><xsl:value-of select="."/></h1> </xsl:template> <xsl:template match="chapter"> <h2><xsl:value-of select="title"/></h2> <p><xsl:apply-templates select="p"/></p> <xsl:apply-templates select="section"/> </xsl:template> <xsl:template match="section"> <h3><xsl:value-of select="title"/></h3> <p><xsl:apply-templates select="p"/></p> <xsl:apply-templates select="sub-section"/> </xsl:template> <xsl:template match="sub-section"> <b><xsl:value-of select="title"/></b> <p><xsl:apply-templates select="p"/></p> <xsl:apply-templates select="list"/> </xsl:template> <xsl:template match="p"> <xsl:if test="position() != 1"><br/> </xsl:if> <xsl:value-of select="."/> </xsl:template> <xsl:template match="list"> <ul><xsl:apply-templates select="item"/></ul> </xsl:template> <xsl:template match="item"> <li><xsl:value-of select="."/></li> </xsl:template> </xsl:stylesheet>