如何修改XSLT 2.0代码实现带命名空间的XML文件合并?
解决带命名空间的XML合并问题
问题核心:你设置的全局xpath-default-namespace="Invoice_Summary_Template"会让所有XPath表达式默认匹配该命名空间下的元素,但collection.xml中的<collection>元素属于无命名空间,导致match="collection"的模板无法触发,同时document()调用后的节点选择也因命名空间匹配问题无法正确定位元素。
修改后的XSLT代码如下:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="Invoice_Summary_Template" exclude-result-prefixes="#all"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/collection"> <ns:Template xsi:schemaLocation="Invoice_Summary_Template" Name="Invoice_Summary_Template" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ns:Batches> <ns:Collection> <xsl:copy-of select="document(doc/@href)/ns:Template/ns:Batches/ns:Collection/ns:Item"/> </ns:Collection> </ns:Batches> </ns:Template> </xsl:template> </xsl:stylesheet>
关键修改点:
- 定义命名空间前缀
ns绑定到Invoice_Summary_Template,避免全局默认命名空间影响无命名空间元素的匹配 - 将模板匹配目标改为
/collection,明确匹配无命名空间的根元素,确保模板正常触发 - 在
copy-of的XPath中使用ns:前缀,精准定位带命名空间的Template、Batches、Collection和Item元素 - 输出元素时通过
ns:前缀确保节点处于目标命名空间,最终输出会自动沿用默认命名空间格式,与期望结果一致
内容的提问来源于stack exchange,提问作者ayk
相关产品推荐
相关产品推荐

