为何给定XSL无法输出已定义的cbc:CustomizationID与cbc:ProfileID元素
命名空间绑定未正确生效
即使在XSL头部声明了xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2",仅依赖前缀cbc:创建元素可能因命名空间未在输出上下文正确传递,导致元素被XML处理器隐式丢弃。正确做法是创建元素时显式指定命名空间URI:<xsl:element name="cbc:CustomizationID" namespace="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"> <xsl:value-of select="'urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0'"/> </xsl:element>同时要检查命名空间URI是否完全符合UBL规范,拼写错误(如大小写、后缀遗漏)会导致元素归到无效命名空间,进而被忽略。
根模板被高优先级模板覆盖
若XSL中存在其他匹配根节点(match="/")或Invoice根元素(match="Invoice")的模板,且优先级更高(比如更具体的匹配模式、带有priority属性),你的目标模板就不会被执行。可以给根模板添加priority="10"确保优先级最高,或检查所有模板的匹配规则,排除冲突。元素创建逻辑的上下文错误
如果根模板中使用了xsl:apply-templates,且将cbc:CustomizationID/cbc:ProfileID放在了该指令的输出分支中,或被xsl:if/xsl:choose的不满足条件分支包裹,都会导致元素无法输出。可以暂时注释掉xsl:apply-templates,仅保留这两个元素的创建代码,验证是否能正常输出。XSLT处理器的命名空间处理差异
部分处理器对命名空间的处理严格度不同,若XSL头部同时声明了默认命名空间和cbc前缀,可能导致前缀关联混乱。建议显式指定所有输出元素的命名空间,避免依赖默认命名空间的继承。
内容的提问来源于stack exchange,提问作者randomvoice

