標準仕様書(TS) TS X 0059:2004

XSLTライブラリ

XSLT Library

序文

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


1. 適用範囲

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


2. 引用規定

次に示す規格等は, この標準仕様書(TS)に引用されることによって, この標準仕様書(TS)の規定の一部を構成する。

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

備考 XSL Transformations (XSLT) Version 1.0, W3C Recommendation, 1999-11 がこの規定に一致している。

JIS X 4159:2002, 拡張可能なマーク付け言語 (XML)

備考 Extensible Markup Language (XML)1.0, W3C Recommendation, 2000-06 がこの規格に一致している。

TR X 0089:2003, XMLパス言語 (XPath) 1.0

備考 XML Path Language (XPath) Version 1.0, W3C Recommendation, 1999-11 がこの規定に一致している。

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

備考1 ISO/IEC 15445:2000, Information Technology — Document Description and Processing Languages — HyperText Markup Language (HTML), 2000-05 がこの規格に一致している。
備考2 JIS X 4156:2000及びISO/IEC 15445:2000は, HyperText Markup Language HTML 4.0, W3C Recommendation, 1998-04 を参照している。


3. 定義

このTSでは, TR X 0048及びTR X 0089における定義, 並びに次の定義を適用する。

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


4. 機能

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

4.1 文字列処理

4.1.1 文字列の検索

文字列の検索機能を, XSLTライブラリとして提供する。

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

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

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

c) 検索したい文字列(検索対象の用語集)を, XPathを使って, 変数xsltlib:search_stringsの値に指定する。
<xsl:variable name="xsltlib:search_strings"
select="document('')/*/xsltlib:word_list/word"/>

変数xsltlib:search_stringsの指定を省略すると何も検索されない。
複数文字列を指定した場合は, 指定した順で検索される。

d) 検索したい文字列が含まれている可能性のあるテキストノードを子要素としてもつ要素(検索対象要素)を, XPathを使って, 変数xsltlib:search_string_targetの値に指定する。
<xsl:variable name="xsltlib:search_string_target" select="//*"/>

変数xsltlib:search_string_targetの指定を省略するとデフォルト値として, 任意の場所にあるテキスト要素が用いられる。

e) 検索された文字列に付与する要素名(検索結果要素)を指定する。
複数の検索対象用語に対して異なる検索結果要素を指定する場合は, 変数xsltlib:search_string_result_tagsの値にそれらを指定すると, 指定した順で使われる。

検索対象によらず固定の文字列を用いる際には, 変数xsltlib:search_string_result_literalを指定する。この指定も省略するとデフォルト値として, 要素名xsltlib:resultが用いられる。

f) 検索対象要素以下を再帰的に検索する場合は, 変数xsltlib:search_string_recursiveの値をtrueに設定する。デフォルトでは再帰的に検索しない。
<xsl:variable name="xsltlib:search_string_recursive" select="true()"/>

g) 名前付きテンプレートxsltlib:search_stringsを呼び出すと, 呼び出した位置にオリジナルインスタンスに対して検索された箇所に検索結果要素が付加されたものが生成される。
<xsl:call-template name="xsltlib:search_strings"/>

h) 名前付きテンプレートxsltlib:search_strings_eachを引数xsltlib:search_string_targetを指定して呼び出すと, 変数xsltlib:search_string_targetの値にかかわらず, 引数xsltlib:search_string_targetの値に対して検索した結果が返される。
<xsl:call-template name="xsltlib:search_strings_each">
<xsl:with-param name="xsltlib:search_string_target" select="."/>
</xsl:call-template>

このライブラリの使用例を, 5.1.1 b)に示す。

4.1.2 文字列の置換

文字列の置換機能を, XSLTライブラリとして提供する。

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

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

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

c) 置換したい文字列(置換対象の用語集)を, XPathを使って, 変数xsltlib:replace_stringsの値に指定する。
<xsl:variable name="xsltlib:replace_strings"
select="document('')/*/xsltlib:word_list/replace/org"/>

変数xsltlib:replace_stringsの指定を省略すると何も置換されない。
複数文字列を指定した場合は, 指定した順で置換される。

d) 置換後の文字列(置換結果の用語集)を, XPathを使って, 変数xsltlib:replace_with_stringsの値に指定する。
<xsl:variable name="xsltlib:replace_with_strings"
select="document('')/*/xsltlib:word_list/replace/to"/>

変数xsltlib:replace_with_stringsの指定を省略するとNULL文字列で置換される。

e) 置換したい文字列が含まれている可能性のあるテキストノードを子要素としてもつ要素(置換対象要素)を, XPathを使って, 変数xsltlib:replace_string_targetの値に指定する。
<xsl:variable name="xsltlib:replace_string_target" select="//*"/>

変数xsltlib:replace_string_targetの指定を省略するとデフォルト値として, 任意の場所にあるテキスト要素が用いられる。

f) 置換された文字列に付与する要素名(置換結果要素)を指定する。
複数の置換対象用語に対して異なる置換結果要素を指定する場合は, 変数xsltlib:replace_string_result_tagsの値にそれらを指定すると, 指定した順で使われる。

置換対象によらず固定の文字列を用いる際には, 変数xsltlib:replace_string_result_literalを指定する。この指定も省略すると置換位置に要素は付与されない。

g) 置換対象要素以下を再帰的に置換する場合は, 変数xsltlib:replace_string_recursiveの値をtrueに設定する。デフォルトでは再帰的に置換しない。
<xsl:variable name="xsltlib:replce_string_recursive" select="true()"/>

h) 名前付きテンプレートxsltlib:replace_stringsを呼び出すと, 呼び出した位置にオリジナルインスタンスに対して置換された結果が生成される。
<xsl:call-template name="xsltlib:replace_strings"/>

i) 名前付きテンプレートxsltlib:replace_strings_eachを引数xsltlib:replace_string_targetを指定して呼び出すと, 変数xsltlib:replace_string_targetの値にかかわらず, 引数xsltlib:replace_string_targetの値に対して置換した結果が返される。
<xsl:call-template name="xsltlib:replace_strings_each">
<xsl:with-param name="xsltlib:replace_string_target" select="."/>
</xsl:call-template>

このライブラリの使用例を, 5.1.2 b)に示す。

4.1.3 文字列の削除

文字列の削除機能を, XSLTライブラリとして提供する。

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

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

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

c) 削除したい文字列(削除対象の用語集)を, XPathを使って, 変数xsltlib:delete_stringsの値に指定する。
<xsl:variable name="xsltlib:delete_strings"
select="document('')/*/xsltlib:word_list/delete"/>

変数xsltlib:delete_stringsの指定を省略すると何も削除されない。
複数文字列を指定した場合は, 指定した順で削除される。

d) 削除したい文字列が含まれている可能性のあるテキストノードを子要素としてもつ要素(削除対象要素)を, XPathを使って, 変数xsltlib:delete_string_targetの値に指定する。
<xsl:variable name="xsltlib:delete_string_target" select="//*"/>

変数xsltlib:delete_string_targetの指定を省略するとデフォルト値として, 任意の場所にあるテキスト要素が用いられる。

e) 文字列が削除された箇所に付与する要素名(削除結果要素)を指定する。
複数の削除対象用語に対して異なる削除結果要素を指定する場合は, 変数xsltlib:delete_string_result_tagsの値にそれらを指定すると, 指定した順で使われる。

削除対象によらず固定の文字列を用いる際には, 変数xsltlib:delete_string_result_literalを指定する。この指定も省略すると削除位置に要素は付与されない。

f) 削除対象要素以下を再帰的に削除する場合は, 変数xsltlib:delete_string_recursiveの値をtrueに設定する。デフォルトでは再帰的に削除しない。
<xsl:variable name="xsltlib:delete_string_recursive" select="true()"/>

g) 名前付きテンプレートxsltlib:delete_stringsを呼び出すと, 呼び出した位置にオリジナルインスタンスに対して削除された結果が生成される。
<xsl:call-template name="xsltlib:delete_strings"/>

h) 名前付きテンプレートxsltlib:delete_strings_eachを引数xsltlib:delete_string_targetを指定して呼び出すと, 変数xsltlib:delete_string_targetの値にかかわらず, 引数xsltlib:delete_string_targetの値に対して削除した結果が返される。
<xsl:call-template name="xsltlib:delete_strings_each">
<xsl:with-param name="xsltlib:delete_string_target" select="."/>
</xsl:call-template>

このライブラリの使用例を, 5.1.3 b)に示す。

4.2 タグの処理

4.2.1 タグの置換

タグの置換機能を, XSLTライブラリとして提供する。

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

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

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

c) 置換したいタグ名(置換対象要素)を, XPathを使って, 変数xsltlib:replace_tagsの値に指定する。
<xsl:variable name="xsltlib:replace_tags"
select="document('')/*/xsltlib:tag_list/replace/org"/>

変数xsltlib:replace_tagsの指定を省略すると何も置換されない。
複数タグ名を指定した場合は, 指定した順で置換される。

d) 置換後のタグ名(置換結果要素)を, XPathを使って, 変数xsltlib:replace_with_tagsの値に指定する。
<xsl:variable name="xsltlib:replace_with_tags"
select="document('')/*/xsltlib:tag_list/replace/to"/>

変数xsltlib:replace_with_tagsの指定を省略すると何も置換されない。

e) 置換したいタグを子要素としてもつ要素(置換対象親要素)を, XPathを使って, 変数xsltlib:replace_tag_targetの値に指定する。
<xsl:variable name="xsltlib:replace_tag_target" select="//*"/>

変数xsltlib:replace_tag_targetの指定を省略するとデフォルト値として, 任意の場所にある要素が用いられる。

f) 置換対象親要素以下を再帰的に置換する場合は, 変数xsltlib:replace_tag_recursiveの値をtrueに設定する。デフォルトでは再帰的に置換しない。
<xsl:variable name="xsltlib:replce_tag_recursive" select="true()"/>

g) 名前付きテンプレートxsltlib:replace_tagsを呼び出すと, 呼び出した位置にオリジナルインスタンスに対して置換された結果が生成される。
<xsl:call-template name="xsltlib:replace_tags"/>

h) 名前付きテンプレートxsltlib:replace_tags_eachを引数xsltlib:replace_tag_targetを指定して呼び出すと, 変数xsltlib:replace_tag_targetの値にかかわらず, 引数xsltlib:replace_tag_targetの値に対して置換した結果が返される。
<xsl:call-template name="xsltlib:replace_tags_each">
<xsl:with-param name="xsltlib:replace_tag_target" select="."/>
</xsl:call-template>

このライブラリの使用例を, 5.2.1 b)に示す。

4.2.2 タグの削除

タグの削除機能を, XSLTライブラリとして提供する。

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

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

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

c) 削除したいタグ名(削除対象要素)を, XPathを使って, 変数xsltlib:delete_tagsの値に指定する。
<xsl:variable name="xsltlib:delete_tags"
select="document('')/*/xsltlib:tag_list/delete"/>

変数xsltlib:delete_tagsの指定を省略すると何も削除されない。
複数タグ名を指定した場合は, 指定した順で削除される。

d) 削除したいタグを子要素としてもつ要素(削除対象親要素)を, XPathを使って, 変数xsltlib:delete_tag_targetの値に指定する。
<xsl:variable name="xsltlib:delete_tag_target" select="//*"/>

変数xsltlib:delete_tag_targetの指定を省略するとデフォルト値として, 任意の場所にある要素が用いられる。

e) 削除対象要素の内容も含めて削除する場合は, 変数xsltlib:delete_tag_contentsの値をtrueに設定する。デフォルトでは内容は削除しない。
<xsl:variable name="xsltlib:delete_tag_contents" select="true()"/>

f) 削除対象親要素以下を再帰的に削除する場合は, 変数xsltlib:delete_tag_recursiveの値をtrueに設定する。デフォルトでは再帰的に削除しない。
<xsl:variable name="xsltlib:delete_tag_recursive" select="true()"/>

g) 名前付きテンプレートxsltlib:delete_tagsを呼び出すと, 呼び出した位置にオリジナルインスタンスに対して削除された結果が生成される。
<xsl:call-template name="xsltlib:delete_tags"/>

h) 名前付きテンプレートxsltlib:delete_tags_eachを引数xsltlib:delete_tag_targetを指定して呼び出すと, 変数xsltlib:delete_tag_targetの値にかかわらず, 引数xsltlib:delete_tag_targetの値に対して削除した結果が返される。
<xsl:call-template name="xsltlib:delete_tags_each">
<xsl:with-param name="xsltlib:delete_tag_target" select="."/>
</xsl:call-template>

このライブラリの使用例を, 5.2.2 b)に示す。

4.3 属性の処理

4.3.1 属性名の置換

属性名の置換機能を, XSLTライブラリとして提供する。

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

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

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

c) 置換したい属性名(置換対象属性)を, XPathを使って, 変数xsltlib:replace_attributesの値に指定する。
<xsl:variable name="xsltlib:replace_attributes"
select="document('')/*/xsltlib:attribute_list/replace/org"/>

変数xsltlib:replace_attributesの指定を省略すると何も置換されない。
複数属性名を指定した場合は, 指定した順で置換される。

d) 置換後の属性名(置換結果属性)を, XPathを使って, 変数xsltlib:replace_with_attributesの値に指定する。
<xsl:variable name="xsltlib:replace_with_attributes"
select="document('')/*/xsltlib:attribute_list/replace/to"/>

変数xsltlib:replace_with_attributesの指定を省略すると何も置換されない。

e) 置換したい属性をもつ要素(置換対象親要素)を, XPathを使って, 変数xsltlib:replace_attribute_targetの値に指定する。
<xsl:variable name="xsltlib:replace_attribute_target" select="//*"/>

変数xsltlib:replace_attribute_targetの指定を省略するとデフォルト値として, 任意の場所にある要素が用いられる。

f) 名前付きテンプレートxsltlib:replace_attributesを呼び出すと, 呼び出した位置にオリジナルインスタンスに対して置換された結果が生成される。
<xsl:call-template name="xsltlib:replace_attributes"/>

g) 名前付きテンプレートxsltlib:replace_attributes_eachを引数xsltlib:replace_attribute_targetを指定して呼び出すと, 変数xsltlib:replace_attribute_targetの値にかかわらず, 引数xsltlib:replace_attribute_targetの値に対して置換した結果が返される。
<xsl:call-template name="xsltlib:replace_attributes_each">
<xsl:with-param name="xsltlib:replace_attribute_target" select="."/>
</xsl:call-template>

このライブラリの使用例を, 5.3.1 b)に示す。

4.3.2 属性の削除

属性名の削除機能を, XSLTライブラリとして提供する。

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

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

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

c) 削除したい属性名(削除対象属性)を, XPathを使って, 変数xsltlib:delete_attributesの値に指定する。
<xsl:variable name="xsltlib:delete_attributes"
select="document('')/*/xsltlib:attribute_list/delete/org"/>

変数xsltlib:delete_attributesの指定を省略すると何も削除されない。
複数属性名を指定した場合は, 指定した順で削除される。

d) 削除したい属性をもつ要素(削除対象親要素)を, XPathを使って, 変数xsltlib:delete_attribute_targetの値に指定する。
<xsl:variable name="xsltlib:delete_attribute_target" select="//*"/>

変数xsltlib:delete_attribute_targetの指定を省略するとデフォルト値として, 任意の場所にある要素が用いられる。

e) 名前付きテンプレートxsltlib:delete_attributesを呼び出すと, 呼び出した位置にオリジナルインスタンスに対して削除された結果が生成される。
<xsl:call-template name="xsltlib:delete_attributes"/>

f) 名前付きテンプレートxsltlib:delete_attributes_eachを引数xsltlib:delete_attribute_targetを指定して呼び出すと, 変数xsltlib:delete_attribute_targetの値にかかわらず, 引数xsltlib:delete_attribute_targetの値に対して削除した結果が返される。
<xsl:call-template name="xsltlib:delete_attributes_each">
<xsl:with-param name="xsltlib:delete_attribute_target" select="."/>
</xsl:call-template>

このライブラリの使用例を, 5.3.2 b)に示す。

4.4 日本語処理

4.4.1 ひらがなとカタカナの相互変換

ひらがな, カタカナの変換機能を, XSLTライブラリとして提供する。

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

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

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

c) 変換したい文字列が含まれている可能性のあるテキストノードを子要素としてもつ要素(変換対象要素)を, XPathを使って, 変数xsltlib:convert_hiragana_katakana_targetの値に指定する。
<xsl:variable name="xsltlib:convert_hiragana_katakana_target" select="//*"/>

変数xsltlib:rconvert_hiragana_katakana_targetの指定を省略するとデフォルト値として, 任意の場所にあるテキスト要素が用いられる。

d) 変換対象要素以下を再帰的に置換する場合は, 変数xsltlib:convert_hiragana_katakana_recursiveの値をtrueに設定する。デフォルトでは再帰的に置換しない。
<xsl:variable name="xsltlib:convert_hiragana_katakana_recursive" select="true()"/>

e) 名前付きテンプレートxsltlib:convert_hiragana_to_katakanaを呼び出すと, 呼び出した位置にオリジナルインスタンスに対してひらがながカタカナに変換された結果が生成される。
<xsl:call-template name="xsltlib:convert_hiragana_to_katakana"/>

f) 名前付きテンプレートxsltlib:convert_katakana_to_hiraganaを呼び出すと, 呼び出した位置にオリジナルインスタンスに対してカタカナがひらがなに変換された結果が生成される。
<xsl:call-template name="xsltlib:convert_katakana_to_hiragana"/>

このライブラリの使用例を, 5.4.1 b)に示す。

4.4.2 全角英数文字と半角英数文字の相互変換

全角英数文字と半角英数文字の変換機能を, XSLTライブラリとして提供する。

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

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

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

c) 変換したい文字列が含まれている可能性のあるテキストノードを子要素としてもつ要素(変換対象要素)を, XPathを使って, 変数xsltlib:convert_zenkaku_hankaku_targetの値に指定する。
<xsl:variable name="xsltlib:convert_zenkaku_hankaku_target" select="//*"/>

変数xsltlib:rconvert_zenkaku_hankaku_targetの指定を省略するとデフォルト値として, 任意の場所にあるテキスト要素が用いられる。

d) 変換対象要素以下を再帰的に置換する場合は, 変数xsltlib:convert_zenkaku_hankaku_recursiveの値をtrueに設定する。デフォルトでは再帰的に置換しない。
<xsl:variable name="xsltlib:convert_zenkaku_hankaku_recursive" select="true()"/>

e) 名前付きテンプレートxsltlib:convert_zenkaku_to_hankakuを呼び出すと, 呼び出した位置にオリジナルインスタンスに対して全角英数文字を半角英数文字に変換された結果が生成される。
<xsl:call-template name="xsltlib:convert_zenkaku_to_hankaku"/>

f) 名前付きテンプレートxsltlib:convert_hankaku_to_zenkakuを呼び出すと, 呼び出した位置にオリジナルインスタンスに対して半角英数文字を全角英数文字に変換された結果が生成される。
<xsl:call-template name="xsltlib:convert_hankaku_to_zenkaku"/>

このライブラリの使用例を, 5.4.2 b)に示す。

4.5 目次・索引の生成

4.5.1 目次の生成

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

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

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

b) ライブラリをインポートする。
<xsl:import href="xsltlib_make_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:make_tocを呼び出す。
<xsl:call-template name="xsltlib:make_toc"/>

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

4.5.2 索引の生成

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

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

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

b) ライブラリをインポートする。
<xsl:import href="xsltlib_make_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:make_indexを呼び出す。
<xsl:call-template name="xsltlib:make_index"/>

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


5. ライブラリ

5.1 文字列処理

5.1.1 文字列の検索

a) 文字列の検索ライブラリ (xsltlib_search_string.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/search_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:variable name="xsltlib:search_strings"/> <xsl:variable name="xsltlib:search_string_target" select="//*"/> <xsl:variable name="xsltlib:search_string_result_literal" select="'xsltlib:result'"/> <xsl:variable name="xsltlib:search_string_result_tags"/> <xsl:variable name="xsltlib:search_string_recursive"/> <xsl:template name="xsltlib:search_strings"> <xsl:apply-templates select="/*" mode="xsltlib:search_strings"/> </xsl:template> <xsl:template match="*|text()" mode="xsltlib:search_strings"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="count(.|$xsltlib:search_string_target)=count($xsltlib:search_string_target)"> <xsl:apply-templates mode="xsltlib:search_strings_each"> <xsl:with-param name="search_strings" select="$xsltlib:search_strings"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:search_strings"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template name="xsltlib:search_strings_each"> <xsl:param name="search_string_target"/> <xsl:for-each select="$search_string_target"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates mode="xsltlib:search_strings_each"> <xsl:with-param name="search_strings" select="$xsltlib:search_strings"/> </xsl:apply-templates> </xsl:copy> </xsl:for-each> </xsl:template> <xsl:template match="*" mode="xsltlib:search_strings_each"> <xsl:param name="search_strings"/> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="$xsltlib:search_string_recursive = true()"> <xsl:apply-templates mode="xsltlib:search_strings_each"> <xsl:with-param name="search_strings" select="$xsltlib:search_strings"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:search_strings"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template match="text()" mode="xsltlib:search_strings_each"> <xsl:param name="search_strings"/> <xsl:call-template name="xsltlib:search_strings_text"> <xsl:with-param name="search_strings" select="$search_strings"/> <xsl:with-param name="target_strings" select="."/> </xsl:call-template> </xsl:template> <xsl:template name="xsltlib:search_strings_text"> <xsl:param name="search_strings"/> <xsl:param name="target_strings"/> <xsl:if test="string-length($target_strings) > 0"> <xsl:choose> <xsl:when test="not($search_strings)"> <xsl:value-of select="$target_strings"/> </xsl:when> <xsl:when test="contains($target_strings, $search_strings[position() = 1])"> <xsl:call-template name="xsltlib:search_strings_text"> <xsl:with-param name="search_strings" select="$search_strings[position() != 1]"/> <xsl:with-param name="target_strings" select="substring-before($target_strings, $search_strings[position() = 1])"/> </xsl:call-template> <xsl:for-each select="$search_strings[position() = 1]"> <xsl:variable name="tagpos"> <xsl:call-template name="xsltlib:calcpos"> <xsl:with-param name="list" select="$xsltlib:search_strings"/> <xsl:with-param name="target" select="."/> </xsl:call-template> </xsl:variable> <xsl:variable name="resulttagname"> <xsl:choose> <xsl:when test="$xsltlib:search_string_result_tags"> <xsl:choose> <xsl:when test="$xsltlib:search_string_result_tags[position() = $tagpos]"> <xsl:value-of select="$xsltlib:search_string_result_tags[position() = $tagpos]"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="xsltlib:search_string_result_tags[position() = last()]"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="$xsltlib:search_string_result_literal"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:element name="{$resulttagname}"> <xsl:value-of select="."/> </xsl:element> </xsl:for-each> <xsl:call-template name="xsltlib:search_strings_text"> <xsl:with-param name="search_strings" select="$search_strings"/> <xsl:with-param name="target_strings" select="substring-after($target_strings, $search_strings[position() = 1])"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="xsltlib:search_strings_text"> <xsl:with-param name="search_strings" select="$search_strings[position() != 1]"/> <xsl:with-param name="target_strings" select="$target_strings"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> <xsl:template name="xsltlib:calcpos"> <xsl:param name="list"/> <xsl:param name="target"/> <xsl:for-each select="$list"> <xsl:if test=". = $target"> <xsl:value-of select="position()"/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>

b1) 文字列の検索ライブラリの使用1 (search_string_sample1.xsl)

任意の階層のpの子供のテキストノード中の'XSLT', '変換', '置換'という文字列を検索し, 検索された箇所に'result'という名前のタグを付与する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/search_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_search_string.xsl"/> <xsl:variable name="xsltlib:search_strings" select="document('')/*/xsltlib:word_list/word"/> <xsl:variable name="xsltlib:search_string_target" select="//p"/> <xsl:variable name="xsltlib:search_string_result_literal" select="'result'"/> <xsl:variable name="xsltlib:search_string_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:search_strings"/> </xsl:template> <xsltlib:word_list> <word>XSLT</word> <word>変換</word> <word>置換</word> </xsltlib:word_list> </xsl:stylesheet>

b2) 文字列の検索ライブラリの使用2 (search_string_sample2.xsl)

任意の階層のtitleの子供のテキストノード中の'XSLT', '変換', '置換'という文字列を検索し, 検索された箇所にそれぞれ'search1', 'search2', 'search3'という名前のタグを付与する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/search_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_search_string.xsl"/> <xsl:variable name="xsltlib:search_strings" select="document('')/*/xsltlib:word_list/word/org"/> <xsl:variable name="xsltlib:search_string_target" select="//title"/> <xsl:variable name="xsltlib:search_string_result_tags" select="document('')/*/xsltlib:word_list/word/tag"/> <xsl:variable name="xsltlib:search_string_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:search_strings"/> </xsl:template> <xsltlib:word_list> <word><tag>search1</tag><org>XSLT</org></word> <word><tag>search2</tag><org>変換</org></word> <word><tag>search3</tag><org>置換</org></word> </xsltlib:word_list> </xsl:stylesheet>

b3) 文字列の検索ライブラリの使用3 (search_string_sample3.xsl)

/document以下の任意の階層のテキストノード中の'XSLT', '変換', '置換'という文字列を検索し, 検索された箇所に'result'という名前のタグを付与する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/search_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_search_string.xsl"/> <xsl:variable name="xsltlib:search_strings" select="document('')/*/xsltlib:word_list/word"/> <xsl:variable name="xsltlib:search_string_target" select="/document"/> <xsl:variable name="xsltlib:search_string_result_literal" select="'result'"/> <xsl:variable name="xsltlib:search_string_recursive" select="true()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:search_strings"/> </xsl:template> <xsltlib:word_list> <word>XSLT</word> <word>変換</word> <word>置換</word> </xsltlib:word_list> </xsl:stylesheet>

b4) 文字列の検索ライブラリの使用4 (search_string_sample4.xsl)

titleノードだけを取り出し、その子供のテキストノード中の'XSLT', '変換', '置換'という文字列を検索し, 検索された箇所にそれぞれ'R1', 'R2', 'R3'という名前のタグを付与する。検索語及びタグのリストは, search_word.xmlに記述されているものを読み込む。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/search_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_search_string.xsl"/> <xsl:variable name="xsltlib:search_strings" select="document('search_word.xml')/word_list/word"/> <xsl:variable name="xsltlib:search_string_result_tags" select="document('search_word.xml')/word_list/word/@tag"/> <xsl:variable name="xsltlib:search_string_recursive" select="false()"/> <xsl:template match="/"> <title_list> <xsl:call-template name="xsltlib:search_strings_each"> <xsl:with-param name="search_string_target" select="//title"/> </xsl:call-template> </title_list> </xsl:template> </xsl:stylesheet>

検索語及びタグのリスト (search_word.xml)

<?xml version="1.0" encoding="Shift_JIS"?> <word_list> <word tag="R1">XSLT</word> <word tag="R2">変換</word> <word tag="R3">置換</word> </word_list>

5.1.2 文字列の置換

a) 文字列の置換ライブラリ (xsltlib_replace_string.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:variable name="xsltlib:replace_strings"/> <xsl:variable name="xsltlib:replace_with_strings"/> <xsl:variable name="xsltlib:replace_string_target" select="//*"/> <xsl:variable name="xsltlib:replace_string_result_literal"/> <xsl:variable name="xsltlib:replace_string_result_tags"/> <xsl:variable name="xsltlib:replace_string_recursive"/> <xsl:template name="xsltlib:replace_strings"> <xsl:apply-templates select="/*" mode="xsltlib:replace_strings"/> </xsl:template> <xsl:template match="*|text()" mode="xsltlib:replace_strings"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="count(.|$xsltlib:replace_string_target)=count($xsltlib:replace_string_target)"> <xsl:apply-templates mode="xsltlib:replace_strings_each"> <xsl:with-param name="replace_strings" select="$xsltlib:replace_strings"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:replace_strings"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template name="xsltlib:replace_strings_each"> <xsl:param name="replace_string_target"/> <xsl:for-each select="$replace_string_target"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates mode="xsltlib:replace_strings_each"> <xsl:with-param name="replace_strings" select="$xsltlib:replace_strings"/> </xsl:apply-templates> </xsl:copy> </xsl:for-each> </xsl:template> <xsl:template match="*" mode="xsltlib:replace_strings_each"> <xsl:param name="replace_strings"/> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="$xsltlib:replace_string_recursive = true()"> <xsl:apply-templates mode="xsltlib:replace_strings_each"> <xsl:with-param name="replace_strings" select="$xsltlib:replace_strings"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:replace_strings"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template match="text()" mode="xsltlib:replace_strings_each"> <xsl:param name="replace_strings"/> <xsl:call-template name="xsltlib:replace_strings_text"> <xsl:with-param name="replace_strings" select="$replace_strings"/> <xsl:with-param name="target_strings" select="."/> </xsl:call-template> </xsl:template> <xsl:template name="xsltlib:replace_strings_text"> <xsl:param name="replace_strings"/> <xsl:param name="target_strings"/> <xsl:if test="string-length($target_strings) > 0"> <xsl:choose> <xsl:when test="not($replace_strings)"> <xsl:value-of select="$target_strings"/> </xsl:when> <xsl:when test="contains($target_strings, $replace_strings[position() = 1])"> <xsl:call-template name="xsltlib:replace_strings_text"> <xsl:with-param name="replace_strings" select="$replace_strings[position() != 1]"/> <xsl:with-param name="target_strings" select="substring-before($target_strings, $replace_strings[position() = 1])"/> </xsl:call-template> <xsl:for-each select="$replace_strings[position() = 1]"> <xsl:variable name="tagpos"> <xsl:call-template name="xsltlib:calcpos"> <xsl:with-param name="list" select="$xsltlib:replace_strings"/> <xsl:with-param name="target" select="."/> </xsl:call-template> </xsl:variable> <xsl:variable name="resulttagname"> <xsl:choose> <xsl:when test="$xsltlib:replace_string_result_tags"> <xsl:choose> <xsl:when test="$xsltlib:replace_string_result_tags[position() = $tagpos]"> <xsl:value-of select="$xsltlib:replace_string_result_tags[position() = $tagpos]"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="xsltlib:replace_string_result_tags[position() = last()]"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="$xsltlib:replace_string_result_literal"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:choose> <xsl:when test="string-length($resulttagname) > 0"> <xsl:element name="{$resulttagname}"> <xsl:if test="$xsltlib:replace_with_strings[position() = $tagpos]"> <xsl:value-of select="$xsltlib:replace_with_strings[position() = $tagpos]"/> </xsl:if> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:value-of select="$xsltlib:replace_with_strings[position() = $tagpos]"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> <xsl:call-template name="xsltlib:replace_strings_text"> <xsl:with-param name="replace_strings" select="$replace_strings"/> <xsl:with-param name="target_strings" select="substring-after($target_strings, $replace_strings[position() = 1])"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="xsltlib:replace_strings_text"> <xsl:with-param name="replace_strings" select="$replace_strings[position() != 1]"/> <xsl:with-param name="target_strings" select="$target_strings"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> <xsl:template name="xsltlib:calcpos"> <xsl:param name="list"/> <xsl:param name="target"/> <xsl:for-each select="$list"> <xsl:if test=". = $target"> <xsl:value-of select="position()"/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>

b1) 文字列の置換ライブラリの使用1 (replace_string_sample1.xsl)

任意の階層のpの子供のテキストノード中の'XSLT', '変換', '置換'という文字列をそれぞれ'XSL Transformations', 'ヘンカン', 'おきかえ'という文字列に置換し, 置換された箇所に'result'という名前のタグを付与する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_replace_string.xsl"/> <xsl:variable name="xsltlib:replace_strings" select="document('')/*/xsltlib:word_list/word/org"/> <xsl:variable name="xsltlib:replace_with_strings" select="document('')/*/xsltlib:word_list/word/to"/> <xsl:variable name="xsltlib:replace_string_target" select="//p"/> <xsl:variable name="xsltlib:replace_string_result_literal" select="'result'"/> <xsl:variable name="xsltlib:replace_string_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:replace_strings"/> </xsl:template> <xsltlib:word_list> <word><org>XSLT</org><to>XSL Transformations</to></word> <word><org>変換</org><to>ヘンカン</to></word> <word><org>置換</org><to>おきかえ</to></word> </xsltlib:word_list> </xsl:stylesheet>

b2) 文字列の置換ライブラリの使用2 (replace_string_sample2.xsl)

任意の階層のtitleの子供のテキストノード中の'XSLT', '変換', '置換'という文字列をそれぞれ'XSL Transformations', 'ヘンカン', 'おきかえ'という文字列に置換し, 置換された箇所にそれぞれ'replace1', 'replace2', 'replace3'という名前のタグを付与する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_replace_string.xsl"/> <xsl:variable name="xsltlib:replace_strings" select="document('')/*/xsltlib:word_list/word/org"/> <xsl:variable name="xsltlib:replace_with_strings" select="document('')/*/xsltlib:word_list/word/to"/> <xsl:variable name="xsltlib:replace_string_target" select="//title"/> <xsl:variable name="xsltlib:replace_string_result_tags" select="document('')/*/xsltlib:word_list/word/tag"/> <xsl:variable name="xsltlib:replace_string_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:replace_strings"/> </xsl:template> <xsltlib:word_list> <word><tag>replace1</tag><org>XSLT</org><to>XSL Transformations</to></word> <word><tag>replace2</tag><org>変換</org><to>ヘンカン</to></word> <word><tag>replace3</tag><org>置換</org><to>おきかえ</to></word> </xsltlib:word_list> </xsl:stylesheet>

b3) 文字列の置換ライブラリの使用3 (replace_string_sample3.xsl)

/document以下の任意の階層のテキストノード中の'XSLT', '変換', '置換'という文字列をそれぞれ'XSL Transformations', 'ヘンカン', 'おきかえ'という文字列に置換し, 置換された箇所にはタグを付与しない。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_replace_string.xsl"/> <xsl:variable name="xsltlib:replace_strings" select="document('')/*/xsltlib:word_list/word/org"/> <xsl:variable name="xsltlib:replace_with_strings" select="document('')/*/xsltlib:word_list/word/to"/> <xsl:variable name="xsltlib:replace_string_target" select="/document"/> <xsl:variable name="xsltlib:replace_string_result_literal"/> <xsl:variable name="xsltlib:replace_string_recursive" select="true()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:replace_strings"/> </xsl:template> <xsltlib:word_list> <word><org>XSLT</org><to>XSL Transformations</to></word> <word><org>変換</org><to>ヘンカン</to></word> <word><org>置換</org><to>おきかえ</to></word> </xsltlib:word_list> </xsl:stylesheet>

b4) 文字列の置換ライブラリの使用4 (replace_string_sample4.xsl)

titleノードだけを取り出し, その子供のテキストノード中の'XSLT', '変換', '置換'という文字列をそれぞれ'XSL Transformations', 'ヘンカン', 'おきかえ'という文字列に置換し, 置換された箇所にそれぞれ'R1', 'R2', 'R3'という名前のタグを付与する。置換語及びタグのリストは, replace_word.xmlに記述されているものを読み込む。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_replace_string.xsl"/> <xsl:variable name="xsltlib:replace_strings" select="document('replace_word.xml')/word_list/word/org"/> <xsl:variable name="xsltlib:replace_with_strings" select="document('replace_word.xml')/word_list/word/to"/> <xsl:variable name="xsltlib:replace_string_result_tags" select="document('replace_word.xml')/word_list/word/@tag"/> <xsl:variable name="xsltlib:replace_string_recursive" select="false()"/> <xsl:template match="/"> <title_list> <xsl:call-template name="xsltlib:replace_strings_each"> <xsl:with-param name="replace_string_target" select="//title"/> </xsl:call-template> </title_list> </xsl:template> </xsl:stylesheet>

置換語及びタグのリスト (replace_word.xml)

<?xml version="1.0" encoding="Shift_JIS"?> <word_list> <word tag="R1"><org>XSLT</org><to>XSL Transformations</to></word> <word tag="R2"><org>変換</org><to>ヘンカン</to></word> <word tag="R3"><org>置換</org><to>おきかえ</to></word> </word_list>

5.1.3 文字列の削除

a) 文字列の削除ライブラリ (xsltlib_delete_string.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:variable name="xsltlib:delete_strings"/> <xsl:variable name="xsltlib:delete_string_target" select="//*"/> <xsl:variable name="xsltlib:delete_string_result_literal"/> <xsl:variable name="xsltlib:delete_string_result_tags"/> <xsl:variable name="xsltlib:delete_string_recursive"/> <xsl:template name="xsltlib:delete_strings"> <xsl:apply-templates select="/*" mode="xsltlib:delete_strings"/> </xsl:template> <xsl:template match="*|text()" mode="xsltlib:delete_strings"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="count(.|$xsltlib:delete_string_target)=count($xsltlib:delete_string_target)"> <xsl:apply-templates mode="xsltlib:delete_strings_each"> <xsl:with-param name="delete_strings" select="$xsltlib:delete_strings"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:delete_strings"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template name="xsltlib:delete_strings_each"> <xsl:param name="delete_string_target"/> <xsl:for-each select="$delete_string_target"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates mode="xsltlib:delete_strings_each"> <xsl:with-param name="delete_strings" select="$xsltlib:delete_strings"/> </xsl:apply-templates> </xsl:copy> </xsl:for-each> </xsl:template> <xsl:template match="*" mode="xsltlib:delete_strings_each"> <xsl:param name="delete_strings"/> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="$xsltlib:delete_string_recursive = true()"> <xsl:apply-templates mode="xsltlib:delete_strings_each"> <xsl:with-param name="delete_strings" select="$xsltlib:delete_strings"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:delete_strings"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template match="text()" mode="xsltlib:delete_strings_each"> <xsl:param name="delete_strings"/> <xsl:call-template name="xsltlib:delete_strings_text"> <xsl:with-param name="delete_strings" select="$delete_strings"/> <xsl:with-param name="target_strings" select="."/> </xsl:call-template> </xsl:template> <xsl:template name="xsltlib:delete_strings_text"> <xsl:param name="delete_strings"/> <xsl:param name="target_strings"/> <xsl:if test="string-length($target_strings) > 0"> <xsl:choose> <xsl:when test="not($delete_strings)"> <xsl:value-of select="$target_strings"/> </xsl:when> <xsl:when test="contains($target_strings, $delete_strings[position() = 1])"> <xsl:call-template name="xsltlib:delete_strings_text"> <xsl:with-param name="delete_strings" select="$delete_strings[position() != 1]"/> <xsl:with-param name="target_strings" select="substring-before($target_strings, $delete_strings[position() = 1])"/> </xsl:call-template> <xsl:for-each select="$delete_strings[position() = 1]"> <xsl:variable name="tagpos"> <xsl:call-template name="xsltlib:calcpos"> <xsl:with-param name="list" select="$xsltlib:delete_strings"/> <xsl:with-param name="target" select="."/> </xsl:call-template> </xsl:variable> <xsl:variable name="resulttagname"> <xsl:choose> <xsl:when test="$xsltlib:delete_string_result_tags"> <xsl:choose> <xsl:when test="$xsltlib:delete_string_result_tags[position() = $tagpos]"> <xsl:value-of select="$xsltlib:delete_string_result_tags[position() = $tagpos]"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="xsltlib:delete_string_result_tags[position() = last()]"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="$xsltlib:delete_string_result_literal"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="string-length($resulttagname) > 0"> <xsl:element name="{$resulttagname}"/> </xsl:if> </xsl:for-each> <xsl:call-template name="xsltlib:delete_strings_text"> <xsl:with-param name="delete_strings" select="$delete_strings"/> <xsl:with-param name="target_strings" select="substring-after($target_strings, $delete_strings[position() = 1])"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="xsltlib:delete_strings_text"> <xsl:with-param name="delete_strings" select="$delete_strings[position() != 1]"/> <xsl:with-param name="target_strings" select="$target_strings"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> <xsl:template name="xsltlib:calcpos"> <xsl:param name="list"/> <xsl:param name="target"/> <xsl:for-each select="$list"> <xsl:if test=". = $target"> <xsl:value-of select="position()"/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>

b1) 文字列の削除ライブラリの使用1 (delete_string_sample1.xsl)

任意の階層のpの子供のテキストノード中の'XSLT', '変換', '削除'という文字列を削除し, 削除された箇所に'deleted'という名前のタグを付与する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_delete_string.xsl"/> <xsl:variable name="xsltlib:delete_strings" select="document('')/*/xsltlib:word_list/word"/> <xsl:variable name="xsltlib:delete_string_target" select="//p"/> <xsl:variable name="xsltlib:delete_string_result_literal" select="'deleted'"/> <xsl:variable name="xsltlib:delete_string_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:delete_strings"/> </xsl:template> <xsltlib:word_list> <word>XSLT</word> <word>変換</word> <word>置換</word> </xsltlib:word_list> </xsl:stylesheet>

b2) 文字列の削除ライブラリの使用2 (delete_string_sample2.xsl)

任意の階層のtitleの子供のテキストノード中の'XSLT', '変換', '削除'という文字列を削除し, 削除された箇所にそれぞれ'delete1', 'delete2', 'delete3'という名前のタグを付与する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_delete_string.xsl"/> <xsl:variable name="xsltlib:delete_strings" select="document('')/*/xsltlib:word_list/word/org"/> <xsl:variable name="xsltlib:delete_string_target" select="//title"/> <xsl:variable name="xsltlib:delete_string_result_tags" select="document('')/*/xsltlib:word_list/word/tag"/> <xsl:variable name="xsltlib:delete_string_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:delete_strings"/> </xsl:template> <xsltlib:word_list> <word><tag>delete1</tag><org>XSLT</org></word> <word><tag>delete2</tag><org>変換</org></word> <word><tag>delete3</tag><org>置換</org></word> </xsltlib:word_list> </xsl:stylesheet>

b3) 文字列の削除ライブラリの使用3 (delete_string_sample3.xsl)

/document以下の任意の階層のテキストノード中の'XSLT', '変換', '削除'という文字列を削除し, 削除された箇所にはタグを付与しない。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_delete_string.xsl"/> <xsl:variable name="xsltlib:delete_strings" select="document('')/*/xsltlib:word_list/word/org"/> <xsl:variable name="xsltlib:delete_string_target" select="/document"/> <xsl:variable name="xsltlib:delete_string_result_literal"/> <xsl:variable name="xsltlib:delete_string_recursive" select="true()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:delete_strings"/> </xsl:template> <xsltlib:word_list> <word><org>XSLT</org></word> <word><org>変換</org></word> <word><org>置換</org></word> </xsltlib:word_list> </xsl:stylesheet>

b4) 文字列の削除ライブラリの使用4 (delete_string_sample4.xsl)

titleノードだけを取り出し、その子供のテキストノード中の'XSLT', '変換', '削除'という文字列を削除し, 削除された箇所にそれぞれ'D1', 'D2', 'D3'という名前のタグを付与する。削除語及びタグのリストは, delete_word.xmlに記述されているものを読み込む。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_string" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_delete_string.xsl"/> <xsl:variable name="xsltlib:delete_strings" select="document('delete_word.xml')/word_list/word/org"/> <xsl:variable name="xsltlib:delete_string_result_tags" select="document('delete_word.xml')/word_list/word/@tag"/> <xsl:variable name="xsltlib:delete_string_recursive" select="false()"/> <xsl:template match="/"> <title_list> <xsl:call-template name="xsltlib:delete_strings_each"> <xsl:with-param name="delete_string_target" select="//title"/> </xsl:call-template> </title_list> </xsl:template> </xsl:stylesheet>

削除語及びタグのリスト (delete_word.xml)

<?xml version="1.0" encoding="Shift_JIS"?> <word_list> <word tag="D1"><org>XSLT</org></word> <word tag="D2"><org>変換</org></word> <word tag="D3"><org>置換</org></word> </word_list>

5.2 タグの処理

5.2.1 タグの置換

a) タグの置換ライブラリ (xsltlib_replace_tag.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_tag" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:variable name="xsltlib:replace_tags"/> <xsl:variable name="xsltlib:replace_with_tags"/> <xsl:variable name="xsltlib:replace_tag_target" select="//*"/> <xsl:variable name="xsltlib:replace_tag_recursive"/> <xsl:template name="xsltlib:replace_tags"> <xsl:apply-templates select="/*" mode="xsltlib:replace_tags"/> </xsl:template> <xsl:template match="*" mode="xsltlib:replace_tags"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="count(.|$xsltlib:replace_tag_target)=count($xsltlib:replace_tag_target)"> <xsl:apply-templates mode="xsltlib:replace_tags_each"> <xsl:with-param name="replace_tags" select="$xsltlib:replace_tags"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:replace_tags"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template name="xsltlib:replace_tags_each"> <xsl:param name="replace_tag_target"/> <xsl:for-each select="$replace_tag_target"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates mode="xsltlib:replace_tags_each"> <xsl:with-param name="replace_tags" select="$xsltlib:replace_tags"/> </xsl:apply-templates> </xsl:copy> </xsl:for-each> </xsl:template> <xsl:template match="*" mode="xsltlib:replace_tags_each"> <xsl:param name="replace_tags"/> <xsl:variable name="orgtagname" select="name()"/> <xsl:choose> <xsl:when test="$replace_tags[. = $orgtagname]"> <xsl:variable name="newtagname"> <xsl:for-each select="$replace_tags[. = $orgtagname][1]"> <xsl:variable name="tagpos"> <xsl:call-template name="xsltlib:calcpos"> <xsl:with-param name="list" select="$xsltlib:replace_tags"/> <xsl:with-param name="target" select="."/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$xsltlib:replace_with_tags"> <xsl:choose> <xsl:when test="$xsltlib:replace_with_tags[position() = $tagpos]"> <xsl:value-of select="$xsltlib:replace_with_tags[position() = $tagpos]"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="xsltlib:replace_with_tags[position() = last()]"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="$orgtagname"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:variable> <xsl:element name="{$newtagname}"> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="$xsltlib:replace_tag_recursive = true()"> <xsl:apply-templates mode="xsltlib:replace_tags_each"> <xsl:with-param name="replace_tags" select="$xsltlib:replace_tags"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:replace_tags"/> </xsl:otherwise> </xsl:choose> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="." mode="xsltlib:replace_tags"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="xsltlib:calcpos"> <xsl:param name="list"/> <xsl:param name="target"/> <xsl:for-each select="$list"> <xsl:if test=". = $target"> <xsl:value-of select="position()"/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>

b1) タグの置換ライブラリの使用1 (replace_tag_sample1.xsl)

documentの子供の'title', 'chapter'というタグ名をそれぞれ't', 'chap'というタグ名に置換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_tag" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_replace_tag.xsl"/> <xsl:variable name="xsltlib:replace_tags" select="document('')/*/xsltlib:tag_list/replace/org"/> <xsl:variable name="xsltlib:replace_with_tags" select="document('')/*/xsltlib:tag_list/replace/to"/> <xsl:variable name="xsltlib:replace_tag_target" select="/document"/> <xsl:variable name="xsltlib:replace_tag_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:replace_tags"/> </xsl:template> <xsltlib:tag_list> <replace><org>title</org><to>t</to></replace> <replace><org>chapter</org><to>chap</to></replace> </xsltlib:tag_list> </xsl:stylesheet>

b2) タグの置換ライブラリの使用2 (replace_tag_sample2.xsl)

任意の階層の'title'というタグ名を't'というタグ名に置換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_tag" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_replace_tag.xsl"/> <xsl:variable name="xsltlib:replace_tags" select="document('')/*/xsltlib:tag_list/tag/org"/> <xsl:variable name="xsltlib:replace_with_tags" select="document('')/*/xsltlib:tag_list/tag/to"/> <xsl:variable name="xsltlib:replace_tag_target" select="//*"/> <xsl:variable name="xsltlib:replace_tag_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:replace_tags"/> </xsl:template> <xsltlib:tag_list> <tag><org>title</org><to>t</to></tag> </xsltlib:tag_list> </xsl:stylesheet>

5.2.2 タグの削除

a) タグの削除ライブラリ (xsltlib_delete_tag.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_tag" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:variable name="xsltlib:delete_tags"/> <xsl:variable name="xsltlib:delete_tag_target" select="//*"/> <xsl:variable name="xsltlib:delete_tag_contents"/> <xsl:variable name="xsltlib:delete_tag_recursive"/> <xsl:template name="xsltlib:delete_tags"> <xsl:apply-templates select="/*" mode="xsltlib:delete_tags"/> </xsl:template> <xsl:template match="*" mode="xsltlib:delete_tags"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="count(.|$xsltlib:delete_tag_target)=count($xsltlib:delete_tag_target)"> <xsl:apply-templates mode="xsltlib:delete_tags_each"> <xsl:with-param name="delete_tags" select="$xsltlib:delete_tags"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:delete_tags"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template name="xsltlib:delete_tags_each"> <xsl:param name="delete_tag_target"/> <xsl:for-each select="$delete_tag_target"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates mode="xsltlib:delete_tags_each"> <xsl:with-param name="delete_tags" select="$xsltlib:delete_tags"/> </xsl:apply-templates> </xsl:copy> </xsl:for-each> </xsl:template> <xsl:template match="*" mode="xsltlib:delete_tags_each"> <xsl:param name="delete_tags"/> <xsl:variable name="orgtagname" select="name()"/> <xsl:choose> <xsl:when test="$delete_tags[. = $orgtagname]"> <xsl:if test="not($xsltlib:delete_tag_contents)"> <xsl:choose> <xsl:when test="$xsltlib:delete_tag_recursive = true()"> <xsl:apply-templates mode="xsltlib:delete_tags_each"> <xsl:with-param name="delete_tags" select="$xsltlib:delete_tags"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:delete_tags"/> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="." mode="xsltlib:delete_tags"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="xsltlib:calcpos"> <xsl:param name="list"/> <xsl:param name="target"/> <xsl:for-each select="$list"> <xsl:if test=". = $target"> <xsl:value-of select="position()"/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>

b1) タグの削除ライブラリの使用1 (delete_tag_sample1.xsl)

documentの子供の'title', 'chapter'というタグ名を削除する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_tag" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_delete_tag.xsl"/> <xsl:variable name="xsltlib:delete_tags" select="document('')/*/xsltlib:tag_list/delete"/> <xsl:variable name="xsltlib:delete_tag_target" select="/document"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:delete_tags"/> </xsl:template> <xsltlib:tag_list> <delete>title</delete> <delete>chapter</delete> </xsltlib:tag_list> </xsl:stylesheet>

b2) タグの削除ライブラリの使用2 (delete_tag_sample2.xsl)

任意の階層の'title'というタグ名及びその内容を削除する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_tag" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_delete_tag.xsl"/> <xsl:variable name="xsltlib:delete_tags" select="document('')/*/xsltlib:tag_list/tag"/> <xsl:variable name="xsltlib:delete_tag_target" select="//*"/> <xsl:variable name="xsltlib:delete_tag_contents" select="true()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:delete_tags"/> </xsl:template> <xsltlib:tag_list> <tag>title</tag> </xsltlib:tag_list> </xsl:stylesheet>

b3) タグの削除ライブラリの使用3 (delete_tag_sample3.xsl)

任意の階層の'sub-section'の子孫の'list', 'item'というタグ名を再帰的に削除する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_tag" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_delete_tag.xsl"/> <xsl:variable name="xsltlib:delete_tags" select="document('')/*/xsltlib:tag_list/tag"/> <xsl:variable name="xsltlib:delete_tag_target" select="//sub-section"/> <xsl:variable name="xsltlib:delete_tag_recursive" select="true()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:delete_tags"/> </xsl:template> <xsltlib:tag_list> <tag>list</tag> <tag>item</tag> </xsltlib:tag_list> </xsl:stylesheet>

5.3 属性の処理

5.3.1 属性名の置換

a) 属性名の置換ライブラリ (xsltlib_replace_attribute.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_attribute" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:variable name="xsltlib:replace_attributes"/> <xsl:variable name="xsltlib:replace_with_attributes"/> <xsl:variable name="xsltlib:replace_attribute_target" select="//*"/> <xsl:template name="xsltlib:replace_attributes"> <xsl:apply-templates select="/*" mode="xsltlib:replace_attributes"/> </xsl:template> <xsl:template match="*" mode="xsltlib:replace_attributes"> <xsl:copy> <xsl:choose> <xsl:when test="count(.|$xsltlib:replace_attribute_target)=count($xsltlib:replace_attribute_target)"> <xsl:apply-templates select="@*" mode="xsltlib:replace_attributes_each"> <xsl:with-param name="replace_attributes" select="$xsltlib:replace_attributes"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:copy-of select="@*"/> </xsl:otherwise> </xsl:choose> <xsl:apply-templates mode="xsltlib:replace_attributes"/> </xsl:copy> </xsl:template> <xsl:template name="xsltlib:replace_attributes_each"> <xsl:param name="replace_attribute_target"/> <xsl:for-each select="$replace_attribute_target"> <xsl:copy> <xsl:apply-templates select="@*" mode="xsltlib:replace_attributes_each"> <xsl:with-param name="replace_attributes" select="$xsltlib:replace_attributes"/> </xsl:apply-templates> <xsl:apply-templates mode="xsltlib:replace_attributes"/> </xsl:copy> </xsl:for-each> </xsl:template> <xsl:template match="@*" mode="xsltlib:replace_attributes_each"> <xsl:param name="replace_attributes"/> <xsl:variable name="orgattributename" select="name()"/> <xsl:choose> <xsl:when test="$replace_attributes[. = $orgattributename]"> <xsl:variable name="newattributename"> <xsl:for-each select="$replace_attributes[. = $orgattributename][1]"> <xsl:variable name="attributepos"> <xsl:call-template name="xsltlib:calcpos"> <xsl:with-param name="list" select="$xsltlib:replace_attributes"/> <xsl:with-param name="target" select="."/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$xsltlib:replace_with_attributes"> <xsl:choose> <xsl:when test="$xsltlib:replace_with_attributes[position() = $attributepos]"> <xsl:value-of select="$xsltlib:replace_with_attributes[position() = $attributepos]"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="xsltlib:replace_with_attributes[position() = last()]"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="$orgattributename"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:variable> <xsl:attribute name="{$newattributename}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:copy-of select="."/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="xsltlib:calcpos"> <xsl:param name="list"/> <xsl:param name="target"/> <xsl:for-each select="$list"> <xsl:if test=". = $target"> <xsl:value-of select="position()"/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>

b1) 属性名の置換ライブラリの使用1 (replace_attribute_sample1.xsl)

chapterの'id'という属性名を'number'という属性名に置換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_attribute" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_replace_attribute.xsl"/> <xsl:variable name="xsltlib:replace_attributes" select="document('')/*/xsltlib:attribute_list/replace/org"/> <xsl:variable name="xsltlib:replace_with_attributes" select="document('')/*/xsltlib:attribute_list/replace/to"/> <xsl:variable name="xsltlib:replace_attribute_target" select="//chapter"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:replace_attributes"/> </xsl:template> <xsltlib:attribute_list> <replace><org>id</org><to>number</to></replace> </xsltlib:attribute_list> </xsl:stylesheet>

b2) 属性名の置換ライブラリの使用2 (replace_attribute_sample2.xsl)

任意の要素の'id'という属性名を'num'という属性名に置換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/replace_attribute" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_replace_attribute.xsl"/> <xsl:variable name="xsltlib:replace_attributes" select="document('')/*/xsltlib:attribute_list/attribute/org"/> <xsl:variable name="xsltlib:replace_with_attributes" select="document('')/*/xsltlib:attribute_list/attribute/to"/> <xsl:variable name="xsltlib:replace_attribute_target" select="//*"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:replace_attributes"/> </xsl:template> <xsltlib:attribute_list> <attribute><org>id</org><to>num</to></attribute> </xsltlib:attribute_list> </xsl:stylesheet>

5.3.2 属性の削除

a) 属性の削除ライブラリ (xsltlib_delete_attribute.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_attribute" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:variable name="xsltlib:delete_attributes"/> <xsl:variable name="xsltlib:delete_attribute_target" select="//*"/> <xsl:template name="xsltlib:delete_attributes"> <xsl:apply-templates select="/*" mode="xsltlib:delete_attributes"/> </xsl:template> <xsl:template match="*" mode="xsltlib:delete_attributes"> <xsl:copy> <xsl:choose> <xsl:when test="count(.|$xsltlib:delete_attribute_target)=count($xsltlib:delete_attribute_target)"> <xsl:apply-templates select="@*" mode="xsltlib:delete_attributes_each"> <xsl:with-param name="delete_attributes" select="$xsltlib:delete_attributes"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:copy-of select="@*"/> </xsl:otherwise> </xsl:choose> <xsl:apply-templates mode="xsltlib:delete_attributes"/> </xsl:copy> </xsl:template> <xsl:template name="xsltlib:delete_attributes_each"> <xsl:param name="delete_attribute_target"/> <xsl:for-each select="$delete_attribute_target"> <xsl:copy> <xsl:apply-templates select="@*" mode="xsltlib:delete_attributes_each"> <xsl:with-param name="delete_attributes" select="$xsltlib:delete_attributes"/> </xsl:apply-templates> <xsl:apply-templates mode="xsltlib:delete_attributes"/> </xsl:copy> </xsl:for-each> </xsl:template> <xsl:template match="@*" mode="xsltlib:delete_attributes_each"> <xsl:param name="delete_attributes"/> <xsl:variable name="orgattributename" select="name()"/> <xsl:if test="not($delete_attributes[. = $orgattributename])"> <xsl:copy-of select="."/> </xsl:if> </xsl:template> <xsl:template name="xsltlib:calcpos"> <xsl:param name="list"/> <xsl:param name="target"/> <xsl:for-each select="$list"> <xsl:if test=". = $target"> <xsl:value-of select="position()"/> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>

b1) 属性の削除ライブラリの使用1 (delete_attribute_sample1.xsl)

chapterの'id'という属性を削除する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_attribute" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_delete_attribute.xsl"/> <xsl:variable name="xsltlib:delete_attributes" select="document('')/*/xsltlib:attribute_list/delete"/> <xsl:variable name="xsltlib:delete_attribute_target" select="//chapter"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:delete_attributes"/> </xsl:template> <xsltlib:attribute_list> <delete>id</delete> </xsltlib:attribute_list> </xsl:stylesheet>

b2) 属性の削除ライブラリの使用2 (delete_attribute_sample2.xsl)

任意の要素の'id'という属性を削除する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/delete_attribute" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_delete_attribute.xsl"/> <xsl:variable name="xsltlib:delete_attributes" select="document('')/*/xsltlib:attribute_list/attribute"/> <xsl:variable name="xsltlib:delete_attribute_target" select="//*"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:delete_attributes"/> </xsl:template> <xsltlib:attribute_list> <attribute>id</attribute> </xsltlib:attribute_list> </xsl:stylesheet>

5.4 日本語処理

5.4.1 ひらがなとカタカナとの相互変換

a) ひらがなとカタカナとの相互変換ライブラリ (xsltlib_convert_hiragana_katakana.xsl)

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/convert_hiragana_katakana" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:variable name="xsltlib:convert_hiragana_katakana_target" select="//*"/> <xsl:variable name="xsltlib:convert_hiragana_katakana_recursive"/> <xsl:variable name="xsltlib:hiragana" select="'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉっゃゅょゎ'"/> <xsl:variable name="xsltlib:katakana" select="'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポァィゥェォッャュョヮ'"/> <xsl:template name="xsltlib:convert_hiragana_to_katakana"> <xsl:apply-templates select="/*" mode="xsltlib:convert_hiragana_katakana"> <xsl:with-param name="dir" select="'h2k'"/> </xsl:apply-templates> </xsl:template> <xsl:template name="xsltlib:convert_katakana_to_hiragana"> <xsl:apply-templates select="/*" mode="xsltlib:convert_hiragana_katakana"> <xsl:with-param name="dir" select="'k2h'"/> </xsl:apply-templates> </xsl:template> <xsl:template match="*|text()" mode="xsltlib:convert_hiragana_katakana"> <xsl:param name="dir"/> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="count(.|$xsltlib:convert_hiragana_katakana_target)=count($xsltlib:convert_hiragana_katakana_target)"> <xsl:apply-templates mode="xsltlib:convert_hiragana_katakana_each"> <xsl:with-param name="dir" select="$dir"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:convert_hiragana_katakana"> <xsl:with-param name="dir" select="$dir"/> </xsl:apply-templates> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template name="xsltlib:convert_hiragana_to_katakana_each"> <xsl:param name="convert_hiragana_katakana_target"/> <xsl:for-each select="$convert_hiragana_katakana_target"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates mode="xsltlib:convert_hiragana_katakana_each"> <xsl:with-param name="dir" select="'h2k'"/> </xsl:apply-templates> </xsl:copy> </xsl:for-each> </xsl:template> <xsl:template name="xsltlib:convert_katakana_to_hiragana_each"> <xsl:param name="convert_hiragana_katakana_target"/> <xsl:for-each select="$convert_hiragana_katakana_target"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates mode="xsltlib:convert_hiragana_katakana_each"> <xsl:with-param name="dir" select="'k2h'"/> </xsl:apply-templates> </xsl:copy> </xsl:for-each> </xsl:template> <xsl:template match="*" mode="xsltlib:convert_hiragana_katakana_each"> <xsl:param name="dir"/> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:choose> <xsl:when test="$xsltlib:convert_hiragana_katakana_recursive = true()"> <xsl:apply-templates mode="xsltlib:convert_hiragana_katakana_each"> <xsl:with-param name="dir" select="$dir"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="xsltlib:convert_hiragana_katakana"> <xsl:with-param name="dir" select="$dir"/> </xsl:apply-templates> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> <xsl:template match="text()" mode="xsltlib:convert_hiragana_katakana_each"> <xsl:param name="dir"/> <xsl:choose> <xsl:when test="$dir = 'h2k'"> <xsl:value-of select="translate(., $xsltlib:hiragana, $xsltlib:katakana)"/> </xsl:when> <xsl:when test="$dir = 'k2h'"> <xsl:value-of select="translate(., $xsltlib:katakana, $xsltlib:hiragana)"/> </xsl:when> </xsl:choose> </xsl:template> </xsl:stylesheet>

b1) ひらがなとカタカナとの相互変換ライブラリの使用1 (convert_hiragana_katakana_sample1.xsl)

任意の階層のpの子供のテキストノード中のひらがなをかたかなに変換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/convert_hiragana_katakana" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_convert_hiragana_katakana.xsl"/> <xsl:variable name="xsltlib:convert_hiragana_katakana_target" select="//p"/> <xsl:variable name="xsltlib:convert_hiragana_katakana_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:convert_hiragana_to_katakana"/> </xsl:template> </xsl:stylesheet>

b2) ひらがなとカタカナとの相互変換ライブラリの使用2 (convert_hiragana_katakana_sample2.xsl)

任意の階層のtitleの子供のテキストノード中のかたかなをひらがなに変換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/convert_hiragana_katakana" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_convert_hiragana_katakana.xsl"/> <xsl:variable name="xsltlib:convert_hiragana_katakana_target" select="//title"/> <xsl:variable name="xsltlib:convert_hiragana_katakana_recursive" select="false()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:convert_katakana_to_hiragana"/> </xsl:template> </xsl:stylesheet>

b3) ひらがなとカタカナとの相互変換ライブラリの使用3 (convert_hiragana_katakana_sample3.xsl)

/document以下の任意の階層のテキストノード中のひらがなをかたかなに変換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/convert_hiragana_katakana" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_convert_hiragana_katakana.xsl"/> <xsl:variable name="xsltlib:convert_hiragana_katakana_target" select="/document"/> <xsl:variable name="xsltlib:convert_hiragana_katakana_recursive" select="true()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:convert_hiragana_to_katakana"/> </xsl:template> </xsl:stylesheet>

b4) ひらがなとカタカナとの相互変換ライブラリの使用4 (convert_hiragana_katakana_sample4.xsl)

titleノードだけを取り出し, その子供のテキストノード中のひらがなをかたかなに変換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/convert_hiragana_katakana" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_convert_hiragana_katakana.xsl"/> <xsl:template match="/"> <title-list> <xsl:call-template name="xsltlib:convert_hiragana_to_katakana_each"> <xsl:with-param name="convert_hiragana_katakana_target" select="//title"/> </xsl:call-template> </title-list> </xsl:template> </xsl:stylesheet>

5.4.2 全角英数文字と半角英数文字との相互変換

a) 全角英数文字と半角英数文字との相互変換ライブラリ (xsltlib_convert_zenkaku_hankaku.xsl)

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/convert_zenkaku_hankaku" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:variable name="xsltlib:convert_zenkaku_hankaku_target" select="//*"/> <xsl:variable name="xsltlib:convert_zenkaku_hankaku_recursive"/> <xsl:variable name="xsltlib:zenkaku" select="'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'"/> <xsl:variable name="xsltlib:hankaku" select="'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'"/> <xsl:template name="xsltlib:convert_zenkaku_to_hankaku"> <xsl:apply-templates select="/*" mode="xsltlib:convert_zenkaku_hankaku">

b1) 全角英数文字と半角英数文字との相互変換ライブラリの使用1 (convert_zenkaku_hankaku_sample1.xsl)

任意の階層のpの子孫のテキストノード中の半角英数文字を全角英数文字に変換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/convert_zenkaku_hankaku" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_convert_zenkaku_hankaku.xsl"/> <xsl:variable name="xsltlib:convert_zenkaku_hankaku_target" select="//p"/> <xsl:variable name="xsltlib:convert_zenkaku_hankaku_recursive" select="true()"/> <xsl:template match="/"> <xsl:call-template name="xsltlib:convert_hankaku_to_zenkaku"/> </xsl:template> </xsl:stylesheet>

b2) 全角英数文字と半角英数文字との相互変換ライブラリの使用2 (convert_zenkaku_hankaku_sample2.xsl)

titleノードだけを取り出し, その子供のテキストノード中の半角英数文字を全角英数文字に変換する。

<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/convert_zenkaku_hankaku" exclude-result-prefixes="xsltlib" version="1.0"> <xsl:import href="xsltlib_convert_zenkaku_hankaku.xsl"/> <xsl:template match="/"> <title-list> <xsl:call-template name="xsltlib:convert_hankaku_to_zenkaku_each"> <xsl:with-param name="convert_zenkaku_hankaku_target" select="//title"/> </xsl:call-template> </title-list> </xsl:template> </xsl:stylesheet>

5.5 目次・索引の生成

5.5.1 目次の生成

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

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

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/make_toc" version="1.0"> <xsl:import href="xsltlib_make_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:make_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|appendix"> <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.5.2 索引の生成

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/make_index" version="1.0"> <xsl:variable name="xsltlib:index_ent" select="//term"/> <xsl:variable name="xsltlib:index_ref" select="//title"/> <xsl:template name="xsltlib:make_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) 索引生成ライブラリの使用 (make_index_sample.xsl)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsltlib="http://jsa.or.jp/xsltlib/make_index" version="1.0"> <xsl:import href="xsltlib_make_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:make_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>