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

问题描述 投票:0回答:1

我在尝试更改 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 namespaces transform
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.