所以我有一个输入文件,在默认命名空间(xmlns="companyURL"
)中使用我公司的命名空间,但我希望我的输出文件使用默认命名空间(xmlns:cmp="companyURL"
)之外的其他内容。所以我使用cmp
命名空间构造我的文件,但后来我想复制一些内部元素:
<xsl:element name="cmp:container">
<xsl:for-each select="foo">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:element>
不幸的是,这样做是为每个内部元素定义默认命名空间,使文件非常冗长和丑陋。简化示例:
来源:
<foo xmlns="companyURL">
<num1>asdf</num1>
<num2>ghjkl</num2>
</foo>
变成:
<cmp:container xmlns:cmp="companyURL">
<num1 xmlns="companyURL">asdf</num1>
<num2 xmlns="companyURL">ghjkl</num2>
</cmp:container>
当然,companyURL
很大很长很难看,两个地方都是一样的,所以我希望上面的结果只是如下:
<cmp:container xmlns:cmp="companyURL">
<cmp:num1>asdf</cmp:num1>
<cmp:num2>ghjkl</cmp:num2>
</cmp:container>
是否有一种简单的方法可以执行此操作,还是应该将cmp
命名空间下的所有内容转换为默认命名空间?如果可能,我更愿意使用显式命名空间命名,它有助于根据我的经验理解XSLT。
答案 0 :(得分:10)
此转化:
<xsl:template match="*">
<xsl:element name="cmp:{name()}" namespace="CompanyURL">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="/*">
<cmp:container xmlns:cmp="CompanyURL">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</cmp:container>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上执行:
<foo xmlns="companyURL">
<num1>asdf</num1>
<num2>ghjkl</num2>
</foo>
生成想要的正确结果:
<cmp:container xmlns:cmp="CompanyURL">
<cmp:num1>asdf</cmp:num1>
<cmp:num2>ghjkl</cmp:num2>
</cmp:container>