XSLT转换UBL至PUF时,如何移除Invoice子节点冗余命名空间?
移除UBL转PUF时Invoice直接子节点的冗余旧命名空间
这种问题通常是因为原XSL模板处理根节点<Invoice>的直接子元素时,默认继承了源UBL文档的命名空间绑定,而深层子节点可能被模板重新处理过,所以没带冗余命名空间。可以通过显式控制元素的命名空间来解决:
通用解决方案:全局清除冗余UBL命名空间
如果要全局移除所有元素上的旧UBL命名空间(urn:oasis:names:specification:ubl:schema:xsd:Invoice-2这类),替换原有的元素复制逻辑为以下模板:
<!-- 匹配所有元素,重新创建不带冗余UBL命名空间的元素 --> <xsl:template match="*"> <!-- 保留元素本地名称,若目标PUF有统一命名空间,替换namespace值为PUF的命名空间 --> <xsl:element name="{local-name()}" namespace=""> <!-- 复制所有非UBL命名空间的属性 --> <xsl:copy-of select="@*[not(starts-with(namespace-uri(), 'urn:oasis:names:specification:ubl'))]"/> <!-- 递归处理子节点 --> <xsl:apply-templates/> </xsl:element> </xsl:template>
针对性解决方案:仅处理Invoice的直接子节点
如果只需要处理<Invoice>的直接子节点,避免影响其他元素,添加专门的匹配模板:
<!-- 专门匹配Invoice的直接子节点,强制清除UBL旧命名空间 --> <xsl:template match="Invoice/*"> <!-- 替换namespace为PUF文件的目标命名空间(如果有),空值则使用无命名空间 --> <xsl:element name="{local-name()}" namespace="urn:puf:target-namespace"> <!-- 复制非UBL命名空间的属性 --> <xsl:copy-of select="@*[not(starts-with(namespace-uri(), 'urn:oasis:names:specification:ubl'))]"/> <xsl:apply-templates/> </xsl:element> </xsl:template> <!-- 通用元素处理模板,保持深层子节点的现有逻辑 --> <xsl:template match="*"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:template>
关键注意事项
- 把代码中的
urn:puf:target-namespace替换为PUF文件实际要求的目标命名空间,如果PUF不需要命名空间,直接留空字符串即可 - 原模板中如果用了
<xsl:copy>或<xsl:copy-of>处理元素,会保留源元素的命名空间,需要替换为<xsl:element>来显式控制 - 若需要保留某些UBL相关的合法属性,调整
@*的过滤条件,比如保留特定前缀的属性
内容的提问来源于stack exchange,提问作者KillLaKill
相关产品推荐
相关产品推荐

