它们几乎相同,唯一的例外是文字元素会将样式表<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>
是计算元素名称而不是“编译时”文字。