添加了 xsi:nil="true" 和默认命名空间,并在转换后生成 xmlns=""

Added xsi:nil="true" and default namespace and it produces xmlns="" after transform

我正在尝试为空元素和所有元素添加默认命名空间 xsi:nil="true"。

转换成功地反映了这些名称空间,但 child 的 child 现在包含一个空白的 xmlns 属性。我怎样才能避免这种情况 xmlns=""

XSLT 代码段:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="*[not(text())]">
        <xsl:copy>
            <xsl:attribute name="xsi:nil">true</xsl:attribute>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}" namespace="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter">
            <xsl:namespace name="xsi" select="'http://www.w3.org/2001/XMLSchema-instance'"/>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

XML:

    <ORESB_STAAConfig_DBAdapterOutput>
        <ACODE>A52557</ACODE>
        <DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
        <TYPE>EX</TYPE>
        <INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
        <PAYPHONE_TYPE/>
        <TERMINATION_TYPE>NTE</TERMINATION_TYPE>
    </ORESB_STAAConfig_DBAdapterOutput>
    <ORESB_STAAConfig_DBAdapterOutput>
        <ACODE>A52558</ACODE>
        <DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
        <TYPE>EX</TYPE>
        <INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
        <PAYPHONE_TYPE/>
        <TERMINATION_TYPE>NTE</TERMINATION_TYPE>
    </ORESB_STAAConfig_DBAdapterOutput>
</ORESB_STAAConfig_DBAdapterOutputCollection>

结果XML:

<ORESB_STAAConfig_DBAdapterOutputCollection xmlns="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter"
                                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ORESB_STAAConfig_DBAdapterOutput>
        <ACODE>A52557</ACODE>
        <DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
        <TYPE>EX</TYPE>
        <INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
        <PAYPHONE_TYPE xmlns="" xsi:nil="true"/>
        <TERMINATION_TYPE>NTE</TERMINATION_TYPE>
    </ORESB_STAAConfig_DBAdapterOutput>
    <ORESB_STAAConfig_DBAdapterOutput>
        <ACODE>A52558</ACODE>
        <DESC_TO_CP>WLR ISDN2E System</DESC_TO_CP>
        <TYPE>EX</TYPE>
        <INSTALLATION_TYPE>Standard</INSTALLATION_TYPE>
        <PAYPHONE_TYPE xmlns="" xsi:nil="true"/>
        <TERMINATION_TYPE>NTE</TERMINATION_TYPE>
    </ORESB_STAAConfig_DBAdapterOutput>
</ORESB_STAAConfig_DBAdapterOutputCollection>

如果你想改变所有元素的命名空间,那么你不能在

中使用xsl:copy
<xsl:template match="*[not(text())]">
    <xsl:copy>

但需要

<xsl:template match="*[not(text())]">
     <xsl:element name="{local-name()}" namespace="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter">