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}
错误原因
- XSLT样式表的
<xsl:stylesheet>根节点未声明xsi命名空间前缀,导致处理器无法识别xsi:noNamespaceSchemaLocation中的前缀。 - 代码重复创建了
<InvoiceTransmission>元素,外层直接书写的元素与内部<xsl:element>创建的元素冲突,不符合目标结构。 <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
相关产品推荐
相关产品推荐

