在 XSL 翻译中更改 XML 文件的命名空间

2023-12-27

所以我有一个输入文件,它在默认命名空间中使用我公司的命名空间(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>

不幸的是,它的作用是为每个内部元素定义默认名称空间,使文件变得极其冗长和丑陋。简化示例:

Source:

<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。


这种转变:

 <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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 XSL 翻译中更改 XML 文件的命名空间 的相关文章

随机推荐