Studying XSLT -- for advanced use -- 更新情報へStudying XSLT -- for advanced use --

Menu

- モード
- スタイルシート埋め込み
- リテラルスタイルシート
- include
- import
- importの上書き
- 名前付きテンプレート
- result tree fragment
- 変数とパラメータ (1)
- 変数とパラメータ (2)
- 変数とパラメータ (3)
- 部分木のコピー
- パラメータの受け渡し
- 属性集合 (1)
- 属性集合 (2)
- namespaceの除去
- namespaceのalias
- 条件処理
- 繰り返し
- ソート(整列)
- 番号付け (1)
- 番号付け (2)
- 番号付け (3)
- document関数
- format-number関数
- Key
- その他の追加関数

このページへのご意見ご感想などお待ちしています(ps8a-okzk@asahi-net.or.jp)
Exclude result prefixes


 スタイルシートでは、namespaceを使って、接頭辞付きの名前を処理することができます。

 例えば、ソース文書の中に、 http://www.asahi-net.or.jp/~ps8a-okzk/xml/というnamespace nameを持つnamespaceに属する要素があるとします。

 この要素を処理する際、スタイルシート文書の中でも、 同じnamespaceを接頭辞(同じ接頭辞でなくてよい)に結びつけるnamespace宣言がないと、 「このnamespaceに属するfoo要素を...」という処理ができません。 (ちなみに、デフォルトnamespaceを使うこともできますが、 XPathの中ではデフォルトnamespaceが有効でないので、 接頭辞に結び付ける必要がある場合が多いです)

 つまりXSLTスタイルシート文書では、 result文書で現れる要素や属性のためのnamespace宣言だけでなく、 ソース文書で現れる要素や属性のためのnamespace宣言も行なう必要があります。

 両方を兼ねているnamespace宣言というのも考えられ、 この2種類を区別するのは大変なので、 XSLT namespace以外のnamespaceに対するnamespaceノードはすべてそのままresult文書にコピーされます。 言い換えれば、現れたnamespaceが有効になるように、適宜namespace宣言が行なわれます。


 この時、ソース文書で現れる要素や属性のためだけのnamespaceは、 result文書にコピーされる必要がありません。

 コピーされる必要がないnamespaceがどれであるかを XSLTプロセッサに教える役目をするのが、 xsl:stylesheetまたはxsl:transform要素の 属性exclude-result-prefixesです。

 リテラルresult要素で属性xsl:exclude-result-prefixesを指定しても、 同じことを行なうことができます。


 これらの属性の値は、接頭辞を空白でつなげたリストです。

 その属性に対して有効なnamespace宣言を利用して、 指定された接頭辞各々に結び付けられたnamespace各々に対して、 namespaceノードをresult文書にコピーしなくてよいことを示します。

 この方法だと、デフォルトnamespaceには接頭辞がないので指定できません。 そこで、デフォルトnamespaceを表す特別な名前#defaultを接頭辞代わりに指定することによって、 デフォルトnamespaceに対して同様のことを行なうことができます。

 例えば以下のように記述すると、 XHTMLとMathMLのnamespaceについては、namespaceノードがresult文書にコピーされません。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:m="http://www.w3.org/1998/Math/MathML"
    version="1.0" exclude-result-prefixes="#default m">
...
</xsl:stylesheet>

 この属性を持つ要素に対して、 属性値で指定された接頭辞に結びついた有効なnamespace宣言が存在しない場合、エラーとなります。


 属性exclude-result-prefixesxsl:exclude-result-prefixesによる指定は、 その属性を持つ要素とその内容で有効です。

 ただし、xsl:stylesheet要素またはxsl:transform要素の属性exclude-result-prefixesは、 その要素の下でincludeされたりimportされたりするスタイルシートに対しては有効ではない、 とされています。


まとめ
コピーされる必要がないnamespaceがどれであるかを示すために、 xsl:stylesheet要素またはxsl:transform要素の属性exclude-result-prefixesか、リテラルのresult要素の属性xsl:exclude-result-prefixesを、使うことができます。

(属性集合 (2)) <--BACKUP↑ (Studying XSLT -- for advanced use -- 更新情報)NEXT--> (namespaceのalias)