【发布时间】:2011-03-28 16:41:57
【问题描述】:
所以我有一个输入文件,它在默认命名空间 (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。
【问题讨论】:
-
好问题 (+1)。请参阅我的答案以获得简短的解决方案,:)
-
"希望我的输出文件使用默认命名空间以外的其他内容" >> 按照您的示例,更改前缀(或从默认到前缀)并不意味着更改命名空间。从 XML+NS 的角度来看,元素将保持相等(本地名称 + 命名空间不变),即使前缀不同。
-
我指的是标签名称前面的可见标识符。
标签: xml xslt namespaces transform