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

条件性抑制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">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
        </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">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:36:06