删除命名空间并在复制时添加新元素 XML

Remove Namespace and add new elements while copying XML

我有一个简单的 xml 看起来像

<ns0:AAA xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ITSVersion="XML_1.0">
    <ns0:id extension="USER_TYPE"/>
    <ns0:bb>SOME VALUE</ns0:bb>
    <ns0:cc>OTHER VALUE</ns0:cc>
</ns0:AAA>

我正在尝试在顶级元素周围添加一个“包装器”元素 AAA 并从上面的 xml 中删除名称-space 前缀 ns0 ].最后在 <ns0:bb>SOME VALUE</ns0:bb>.

之后添加新元素

我已经尝试为此构建一个 xslt,但不知何故我无法在复制时删除 ns0 前缀,并且我添加的新元素添加了 xmlns=""。不确定我做错了什么。

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:urn="http://www.example.com">
<xsl:output method="xml" omit-xml-declaration="yes" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>           
    </xsl:copy>
</xsl:template>
    
<xsl:template match="/*">
    <xsl:if test="urn:id[@extension='USER_TYPE']">
         <xsl:element name="WRAPPER" namespace="{namespace-uri()}">
            <xsl:apply-templates select="@* | node()" />
                
                <xsl:element name="cred">
                    <xsl:attribute name="user">test123</xsl:attribute>
                    <xsl:element name="password">
                            <xsl:attribute name="root">n</xsl:attribute>
                    </xsl:element>
                </xsl:element>
        </xsl:element>
    </xsl:if>
    
    <xsl:if test="urn:Id[@extension='ASSET_TYPE']">
        <xsl:element name="WRAPPER" namespace="{namespace-uri()}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

xslt 的输出看起来像

<WRAPPER xmlns="http://www.example.com" ITSVersion="XML_1.0">
    <ns0:id xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" extension="USER_TYPE"/>
    <ns0:bb xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SOME VALUE</ns0:bb>
    <ns0:cc xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">OTHER VALUE</ns0:cc>
    <cred xmlns="" user="test123"><password root="n"/></cred>
</WRAPPER>

如您所见,WRAPPER 元素已正确添加,但所有其他元素都有前缀以及 xmlns 属性,我想删除前缀 ns0和来自这些元素的 xmlns 属性。我添加的新元素 cred 显示为空 xmlns.

知道我做错了什么吗?

在此先感谢您的帮助?

你所说的“删除命名空间”实际上需要重命名。这意味着您不能使用 identity transform 模板,它保留处理过的节点 原样 .

尝试按照以下方式进行操作:

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="*"/>

<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>      
    </xsl:element>
</xsl:template>
    
<xsl:template match="/*">
    <WRAPPER>
        <xsl:apply-templates/>
        <cred user="test123">
            <password root="n"/>
        </cred>
    </WRAPPER>
</xsl:template>

</xsl:stylesheet>

应用于您的示例输入,这将产生:

结果

<?xml version="1.0" encoding="UTF-8"?>
<WRAPPER>
   <id extension="USER_TYPE"/>
   <bb>SOME VALUE</bb>
   <cc>OTHER VALUE</cc>
   <cred user="test123">
      <password root="n"/>
   </cred>
</WRAPPER>

注意 literal result elements.

的使用