gpt4 book ai didi

xml - 在 XSL 翻译中更改 XML 文件的 namespace

转载 作者:数据小太阳 更新时间:2023-10-29 01:42:22 26 4
gpt4 key购买 nike

所以我有一个输入文件在默认命名空间 (xmlns="companyURL") 中使用我公司的命名空间,但我希望我的输出文件使用默认命名空间以外的其他名称 ( xmlns:cmp="公司网址")。所以我使用 cmp 命名空间构建我的文件,但我想复制一些内部元素:

<xsl:element name="cmp:container">
<xsl:for-each select="foo">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:element>

不幸的是,它所做的是为每个内部元素定义默认 namespace ,从而使文件非常冗长和丑陋。简化示例:

来源:

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

关于xml - 在 XSL 翻译中更改 XML 文件的 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com