それらはほとんど同じですが、リテラル要素がスタイルシート<h1>
のその時点でスコープ内にある名前空間ノードを結果ツリーに追加するのに対し、は追加しないという点が異なります。これが出力にどのような違いをもたらすかは、スタイルシートに含まれる名前空間宣言と、結果ツリーのどこでそれらを使用するかによって異なります。たとえば、次の変換を入力XMLドキュメントに対して実行します。<xsl:element name="h1">
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foo="http://example.com">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<root>
<foo:element1 />
<foo:element2 />
</root>
</xsl:template>
</xsl:stylesheet>
次の出力を生成します(xsltprocを使用)。
<?xml version="1.0"?>
<root xmlns:foo="http://example.com">
<foo:element1/>
<foo:element2/>
</root>
<root>
ただし、スタイルシートのリテラルを<xsl:element name="root">
代わりにに変更すると、
<?xml version="1.0"?>
<root>
<foo:element1 xmlns:foo="http://example.com"/>
<foo:element2 xmlns:foo="http://example.com"/>
</root>
フォームは<xsl:element>
「foo」名前空間ノードを生成された要素にアタッチしないためです。これが重要で、実際にスタイルシートの名前空間宣言を作成する要素にコピーしたい場合は、<xsl:element>
次のようなものをネストすることでコピーできます。
<xsl:copy-of select="document('')/*/namespace::foo" />
その中に直接(document('')
スタイルシートXMLドキュメント自体へのアクセスを提供するイディオムを使用)。
ただし、一般的に、の主な用途は<xsl:element>
、「コンパイル時」のリテラルではなく、要素名が計算される場合です。