のexclude-result-prefixes
属性はxsl:stylesheet
、として指定された場合、継承され、リテラル結果要素の名前空間uriとプレフィックスの両方を定義しないリテラル結果要素"yes"
(のみ)の名前空間ノードの削除を義務付けます。
Markus Jarderotによる回答の次のステートメントは間違っています:
「exclude-result-prefixesは、結果のルートタグのxmlns:foo=""属性を削除するだけです。」
これが反例です:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:z="z:z" exclude-result-prefixes="z">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<z:x xmlns:z="z:z">
<z:y/>
</z:x>
</xsl:template>
</xsl:stylesheet>
この変換がXMLドキュメント(使用されていない)に適用されると、結果は次のようになります。
<z:x xmlns:z="z:z">
<z:y/>
</z:x>
私たちはそれを見ます:
値(namespace-uri) "z:z"を持つ名前空間の名前空間ノード(および定義)は、最上位要素(Markus Jarderotが「ルートタグ」と呼ぶもの)から削除されません。
プレフィックス付きの名前空間"z"
は、リテラル要素からまったく削除されません。
これは、指定するexclude-result-prefixes="yes"
ことで名前空間がLRE(リテラル結果要素)上にない場合、および名前空間ノードがLRE上にあるが、要素が属する名前空間を定義している場合でも、名前空間を削除できないという単純な事実を示しています。
要素が属する名前空間から要素を削除したり、非LRE要素から名前空間を削除したりするには、いくつかの追加処理を指定する必要があります。
1つの例は、従来のIDルールを次のように置き換えることです。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()[not(self::*)]">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
上記の変換は、要素または属性を「名前空間なし」に属する対応する要素または属性に置き換えます。これの潜在的な用途の1つは、デフォルトの名前空間を持つドキュメントをそのような名前空間のないドキュメントに変換することです。
たとえば、次のソースXMLドキュメントに適用した場合:
<z:x xmlns:z="z:z">
<z:y z:attr="someValue"/>
</z:x>
変換の結果は次のとおりです。
<x>
<y attr="someValue"/>
</x>
最後に警告:
この変換は、同じローカル名を持つが2つの異なる名前空間に属する2つの要素(または2つの属性)を含むドキュメントに適用すると有害な場合があります。変換により、これらは両方とも同じ名前空間に属する要素(または属性)に置き換えられます(名前空間なし)。