You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT转换添加xsi:nil和默认命名空间后出现xmlns=""如何解决

问题原因

你遇到的空白xmlns=""问题由两个核心原因导致:

  1. 模板优先级冲突:匹配空元素的模板*[not(text())]优先级高于通用元素模板*,空元素会优先触发前者的处理逻辑
  2. <xsl:copy>的特性:该指令会复制原始节点的命名空间属性,你的原始XML没有默认命名空间,xsl:copy生成的空元素就会主动加上xmlns="",将自身命名空间重置为无命名空间,和上层配置的默认命名空间做区分。
修正方案

调整空元素模板的处理逻辑,和通用元素保持一致,手动指定目标命名空间,不要用xsl:copy复制原始节点:

<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="@* | text() | comment() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>

    <!-- 处理空元素:手动指定命名空间,添加xsi:nil属性 -->
    <xsl:template match="*[not(node())]">
        <xsl:element name="{local-name()}" namespace="http://xmlns.oracle.com/pcbpel/adapter/db/ORESB_STAAConfig_DBAdapter">
            <xsl:attribute name="xsi:nil">true</xsl:attribute>
        </xsl:element>
    </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>
效果验证

修正后转换出的空元素不会再携带xmlns=""属性,结构如下:

<PAYPHONE_TYPE xsi:nil="true"/>

内容的提问来源于stack exchange,提问作者sanjayselvaraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:36:07