我刚刚开始使用XSLT,并且想知道使用< xsl:element>之间的有效区别是什么.用于定义元素而不是在XSLT中将它们声明为文字.例如,让我们简化一个案例,我将一个小型
XML文档的内容转换为(x)HTML.
1.我可以使用< xsl:element>办法:
<xsl:element name="h1"> <xsl:value-of select="heading"/> </xsl:element>
2.或者手动定义元素:
<h1> <xsl:value-of select="heading"/> </h1>
这两者之间的实际差异是什么,如果存在差异,哪些被认为是“好风格”?
解决方法
它们几乎完全相同,例外是文字< h1> element将向结果树添加样式表中该点范围内的命名空间节点,而< xsl:element name =“h1”>惯于.这与输出的不同之处取决于样式表包含的命名空间声明的确切位置以及结果树中使用它们的位置(如果有的话).例如,针对任何输入XML文档运行以下转换:
<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> form不会将“foo”命名空间节点附加到生成的元素.如果这很重要,并且您确实希望将样式表命名空间声明复制到使用< xsl:element>创建的元素上.你可以通过嵌套这样的东西来做到这一点
<xsl:copy-of select="document('')/*/namespace::foo" />
直接在其中(使用文档(”)的成语,它提供对样式表XML文档本身的访问).