首页 > 解决方案 > 将 xmlns 添加到根元素保留现有的命名空间

问题描述

我有以下 XML:

<RootNode xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cac="http://b/2" xmlns:cbc="http://a/2" xmlns:ns0="SomeNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <cbc:Element1>0000000001234567</cbc:Element1>
   <cbc:Element2>xxxxx</cbc:Element1>
   <cac:Element3>
      <cac:Element4>
         <cac:Element5>
            <cbc:Element6 schemeID="AAA">1234567890123</cbc:Element6>
         </cac:Element5>
      </cac:Element4>
   </cac:Element3>
</RootNode>

我想将 xmlns 属性添加到保留所有其他名称空间的根节点。我有一个 XSLT 来添加命名空间,但它删除了所有命名空间并只添加了 xmlns。

使用此 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="no" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="vDefaultNS" select="'addedNamespace"/>
    
    <!-- Extra -->
    <xsl:template match="*">
        <xsl:element name="{local-name()}" namespace="{$vDefaultNS}">
        <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

我得到:

<?xml version="1.0" encoding="UTF-8"?>
<RootNode xmlns="addedNamespace">
   <cbc:Element1>0000000001234567</cbc:Element1>
   <cbc:Element2>xxxxx</cbc:Element1>
   <cac:Element3>
      <cac:Element4>
         <cac:Element5>
            <cbc:Element6 schemeID="AAA">1234567890123</cbc:Element6>
         </cac:Element5>
      </cac:Element4>
   </cac:Element3>
</RootNode>

但我想要:

<?xml version="1.0" encoding="UTF-8"?>
<RootNode xmlns="addedNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cac="http://b/2" xmlns:cbc="http://a/2" xmlns:ns0="SomeNamespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <cbc:Element1>0000000001234567</cbc:Element1>
   <cbc:Element2>xxxxx</cbc:Element1>
   <cac:Element3>
      <cac:Element4>
         <cac:Element5>
            <cbc:Element6 schemeID="AAA">1234567890123</cbc:Element6>
         </cac:Element5>
      </cac:Element4>
   </cac:Element3>
</RootNode>

标签: xmlxslt

解决方案


我想向根节点添加一个 xmlns 属性

实际上,您想将根元素移动到另一个命名空间。尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/RootNode">
    <RootElement xmlns="addedNamespace">
        <xsl:copy-of select="namespace::*"/>
        <xsl:apply-templates select="@*|node()"/>
    </RootElement>
</xsl:template>

</xsl:stylesheet>

推荐阅读