条件性抑制XML声明失败:XSL无法输出空白XML的问题
问题
尝试使用XSLT 1.0编写样式表,要求当XML中OWNER值为0000080070时输出完全空白的XML,但当前代码无法抑制XML声明,实际输出仍包含声明而非空白内容。
现有XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" omit-xml-declaration="yes" /> <xsl:template match="/"> <xsl:choose> <xsl:when test="//IDOC/ZSCWM_TU[OWNER='0000080070']"> </xsl:when> <xsl:otherwise> <xsl:text disable-output-escaping="yes"><?xml version="1.0" encoding="UTF-8"?> </xsl:text> </xsl:otherwise> </xsl:choose> <xsl:apply-templates/> </xsl:template> <!-- Special template --> <xsl:template match="/*[//IDOC/ZSCWM_TU[OWNER='0000080070']]"> </xsl:template> <!-- Default Template --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
输入XML
<?xml version="1.0" encoding="UTF-8"?> <ZSCWM_-TU_LOADLIST> <IDOC BEGIN="1"> <EDI_DC40 SEGMENT="1"> <TABNAM>EDI_DC40</TABNAM> </EDI_DC40> <ZSCWM_TU SEGMENT="1"> <OWNER>0000080070</OWNER> </ZSCWM_TU> </IDOC> </ZSCWM_-TU_LOADLIST>
当前输出
<?xml version="1.0" encoding="UTF-8"?>
期望输出
完全空白内容
解决方案
当前代码的问题在于:即使设置了omit-xml-declaration="yes",部分XSLT处理器在检测到输出为空时仍可能自动生成XML声明;同时根模板中始终执行xsl:apply-templates,触发后续模板逻辑,导致处理器判断需要输出声明。
修正方案一(推荐)
直接在根模板中控制输出逻辑,匹配目标OWNER时不执行任何输出操作:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" omit-xml-declaration="yes" /> <xsl:template match="/"> <xsl:if test="not(//IDOC/ZSCWM_TU[OWNER='0000080070'])"> <xsl:apply-templates/> </xsl:if> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
说明
- 当
OWNER值匹配时,根模板不执行xsl:apply-templates,也不输出任何内容,确保结果完全空白。 - 正常情况通过默认复制模板输出完整XML结构,
omit-xml-declaration="yes"会抑制声明,若需要保留声明,可将该属性改为no。
修正方案二(兼容特殊处理器)
如果某些处理器仍在空输出时生成声明,可改用text输出方法,彻底避免XML声明自动生成:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:if test="not(//IDOC/ZSCWM_TU[OWNER='0000080070'])"> <xsl:text disable-output-escaping="yes"><?xml version="1.0" encoding="UTF-8"?></xsl:text> <xsl:apply-templates/> </xsl:if> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
说明
- 使用
text输出方法时,处理器不会自动生成XML声明,空输出即为完全空白。 - 正常情况通过
disable-output-escaping手动输出XML声明,再复制所有节点生成完整XML。
内容的提问来源于stack exchange,提问作者Mike Dole
相关产品推荐
相关产品推荐

