我有一个XSL文件来传输另一个XSL文件。我希望命名空间声明在根标记上,而不是在每个元素上重复!!
这是我的样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mynamespace="somenamespace" version="2.0">
<xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes" />
<xsl:template match="myMatchedNode">
<mynamespace:tag>Some text i want inserted into the xsl</mynamespace:tag>
<xsl:copy>
<xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出如下内容:
....
<mynamespace:tag xmlns:mynamespace="somenamespace">Some text i want inserted into the xsl</mynamespace:tag>
....
如何强制命名空间声明到结果的根标记?!
答案 0 :(得分:8)
您需要将命名空间节点插入结果树的document元素。有几种方法可以执行此操作,具体取决于您使用的是XSLT 1.0还是2.0。以下是2.0解决方案。我假设您正在对输入文档进行修改后的身份转换(您的问题没有真正指定):
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- special rule for the document element -->
<xsl:template match="/*">
<xsl:copy>
<!-- Add a namespace node -->
<xsl:namespace name="mynamespace" select="'somenamespace'"/>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- the identity template -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- the rest of your rules -->
</xsl:stylesheet>
要完整地介绍控制输出文档中命名空间的所有不同技术,请查看我网站上“XSLT命名空间”文章的"Not enough namespaces"部分。
答案 1 :(得分:1)
也许我误解了这个问题,但我认为你应该这样做:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="somenamespace"
version="2.0">
<xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes"/>
<xsl:template match="myMatchedNode">
<tag>Some text i want inserted into the xsl</mynamespace>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这应该允许您使用命名空间标记作为默认命名空间,输出文档也将它们作为默认命名空间。您的输入文档仍然可以使用令人讨厌的mynamespace:标记语法。
您也可以尝试这样做:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="somenamespace"
xmlns:mynamespace="somenamespace"
version="2.0">
我不完全确定会用my tag替换mynamespace:tag,如果确实如此,它可能依赖于实现。