使用 XSL 转换表修改 XML 中的命名空间

modify namespace in XML using XSL transformation sheet

提问人:Benjamin 提问时间:11/4/2020 最后编辑:TylerHBenjamin 更新时间:11/21/2023 访问量:187

问:

我在尝试更改 XML 命名空间定义时遇到了问题。

我的输入 XML 中有这个命名空间:<ns3:DataElement xmlns:ns3="http://fakeurl_V3/xsd">

在我的XML中,我有一个字段:<productsList xsi:type="ns3:Segment" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

在我的 XSL 中,我这样做了:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   
    xmlns:ns2="http://fakeurl_V2/xsd"
    xmlns:ns3="http://fakeurl_V3/xsd"
... others namespace ....
>

    <xsl:output method="xml" version="1.0" omit-xml-declaration="no"
        encoding="UTF-8" indent="yes" />
....

<xsl:template match="ns3:*">
  <xsl:element name="ns2:{local-name()}">
  
    <xsl:apply-templates select="@*|node()" />
  </xsl:element>
</xsl:template>

....

结果是:

<ns2:DataElement xmlns:ns2="http://fakeurl_V2/xsd">

<productsList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:type="ns3:Segment">

如您所见,命名空间 ns2 已按照我的意愿进行了更改。

但它并没有影响这条线:我需要转换成:xsi:type="ns3:Segment"xsi:type="ns2:Segment"

你有什么解决方案吗?

XML XSLT 命名空间 转换

评论

1赞 michael.hor257k 11/4/2020
问题是属性的内容不是一个命名空间,而是一个无意义的字符串。您需要使用字符串操作对其进行修改。xsi:type
0赞 Benjamin 11/5/2020
谢谢你的回答,你知道我如何在参数中处理字符串吗?我知道我需要使用类似的东西: select=“fn:replace(fn:string(fn:starts-with('xsi:type', 'ns3')), 'ns3', 'ns2')”
0赞 Benjamin 11/5/2020
这可能不是好方法;fn:starts-with('xsi:type', 'ns3') 但只是一个例子

答:

0赞 michael.hor257k 11/5/2020 #1

您可以添加一个模板,将旧前缀替换为新前缀,例如:

<xsl:template match="@xsi:type">
    <xsl:attribute name="{name()}" select="replace(., '^ns3:', 'ns2:')" />
</xsl:template>

演示https://xsltfiddle.liberty-development.net/gVrvcxa