XSLT转换添加xsi:nil和默认命名空间后出现xmlns=""如何解决
问题原因
你遇到的空白xmlns=""问题由两个核心原因导致:
- 模板优先级冲突:匹配空元素的模板
*[not(text())]优先级高于通用元素模板*,空元素会优先触发前者的处理逻辑 <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
相关产品推荐
相关产品推荐

