如何用XSLT合并同一父节点下多个<reference>节点的子元素
这个需求完全可以通过XSLT实现,以下是可直接使用的实现方案:
实现原理
采用XSLT的「身份转换」作为基础逻辑:默认会原封不动复制所有节点、属性和文本内容,仅针对需要调整的reference节点做特殊处理,符合你「其余节点内容保持不变」的要求。
完整XSLT代码(兼容XSLT 1.0/2.0/3.0)
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份转换模板:默认复制所有节点 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理payment节点的模板 --> <xsl:template match="payment"> <xsl:copy> <!-- 先复制payment下所有非reference的子节点 --> <xsl:apply-templates select="@*|*[not(name()='reference')]"/> <!-- 新增一个合并后的reference节点 --> <reference> <!-- 把当前payment下所有reference的row子节点都复制进来 --> <xsl:apply-templates select="reference/row"/> </reference> </xsl:copy> </xsl:template> </xsl:stylesheet>
使用说明
你可以用任意常见的XSLT处理器运行上述代码:
- 桌面端工具:xsltproc、Saxon、XML Spy
- 在线工具:可直接搜索在线XSLT转换工具,把源XML和上述XSLT代码粘贴进去即可生成目标结果
注:你提供的目标输出示例中第二个
payment节点的remoteId位置发生了变化,如果你确实需要调整节点顺序,只需要修改上述payment模板里的节点选择顺序即可,当前代码默认保留源XML中除reference外所有节点的原有顺序。
内容的提问来源于stack exchange,提问作者Almoral
相关产品推荐
相关产品推荐

