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

XSLT转换根元素命名空间参数配置报错XTDE0860

解决XSLT中XTDE0860未声明xsi命名空间前缀的问题

问题场景

需要将输入XML转换为指定格式,要求根元素<InvoiceTransmission>包含xsi命名空间声明及xsi:noNamespaceSchemaLocation属性,但当前XSLT代码运行时触发错误:XTDE0860 未声明命名空间前缀{xsi}。

目标输出格式

<InvoiceTransmission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="IATAFuelInvoiceStandardv2.0.2.xsd">
  <InvoiceTransmissionHeader>
    <InvoiceCreationDate>2020-07-23</InvoiceCreationDate>
    <Version>2.0.2</Version>
  </InvoiceTransmissionHeader>
.....
</InvoiceTransmission>

原错误XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

    <xsl:output method="xml" encoding="UTF-8" standalone="no"/>

    <xsl:template match="/">        
        <!--<InvoiceTransmission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="IATAFuelInvoiceStandardv2.0.2.xsd">-->
        <InvoiceTransmission> 
        <xsl:element name="InvoiceTransmission"> 
            <xsl:namespace name="xsi" select="'http://www.w3.org/2001/XMLSchema-instance'" />           
            <xsl:attribute name="xsi:noNamespaceSchemaLocation">
                <xsl:value-of select="IATAFuelInvoiceStandardv2.0.2.xsd" />
            </xsl:attribute>
        </xsl:element>
        <xsl:apply-templates select="SSC"/>
        </InvoiceTransmission>
    </xsl:template>
</xsl:stylesheet> 

错误信息

XTDE0860  Undeclared namespace prefix {xsi}

错误原因

  1. XSLT样式表的<xsl:stylesheet>根节点未声明xsi命名空间前缀,导致处理器无法识别xsi:noNamespaceSchemaLocation中的前缀。
  2. 代码重复创建了<InvoiceTransmission>元素,外层直接书写的元素与内部<xsl:element>创建的元素冲突,不符合目标结构。
  3. <xsl:value-of select="IATAFuelInvoiceStandardv2.0.2.xsd"中的字符串未加引号,XSLT会将其当作节点路径解析,而非直接输出固定字符串。

修正后的XSLT代码

方式一:直接字面量定义根元素(最简洁)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    exclude-result-prefixes="xs xsi" version="2.0">

    <xsl:output method="xml" encoding="UTF-8" standalone="no" indent="yes"/>

    <xsl:template match="/">        
        <InvoiceTransmission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                             xsi:noNamespaceSchemaLocation="IATAFuelInvoiceStandardv2.0.2.xsd">
            <xsl:apply-templates select="SSC"/>
        </InvoiceTransmission>
    </xsl:template>
</xsl:stylesheet>

方式二:使用<xsl:element>动态创建(适合动态控制属性的场景)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    exclude-result-prefixes="xs xsi" version="2.0">

    <xsl:output method="xml" encoding="UTF-8" standalone="no" indent="yes"/>

    <xsl:template match="/">        
        <xsl:element name="InvoiceTransmission">
            <xsl:attribute name="xsi:noNamespaceSchemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">
                IATAFuelInvoiceStandardv2.0.2.xsd
            </xsl:attribute>
            <xsl:apply-templates select="SSC"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

关键说明

  • 在<xsl:stylesheet>中声明xsi命名空间,确保XSLT处理器能识别该前缀。
  • 添加exclude-result-prefixes="xsi"可避免该命名空间被不必要地输出到其他元素上。
  • 输出固定字符串时无需使用<xsl:value-of>,直接写入属性内容即可;若需动态取值,再用<xsl:value-of>并确保路径正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:31:03