You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求实现合并多XML中materialsAvailibility节点的XSLT映射

XSLT合并多XML的materialsAvailibility节点解决方案

需求说明

我正在学习XSLT映射,遇到一个基础需求:拥有多个XML payload,其中header和partner节点始终完全相同,需要将所有payload中的materialsAvailibility节点合并到一个XML文档中。

输入示例

Payload 1

<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <header>
    <quoteType>YQT</quoteType>
    <salesOrg>5010</salesOrg>
    <distributionChannel>00</distributionChannel>
    <division>00</division>
    <deliveryDateHeader>2022-09-29T00:00Z</deliveryDateHeader>
    <shippingCondition>01</shippingCondition>
  </header>
  <partner>
    <partnerNumber>100193</partnerNumber>
    <partnerFunction>SP</partnerFunction>
  </partner>
  <partner>
    <partnerNumber>100193</partnerNumber>
    <partnerFunction>WE</partnerFunction>
  </partner>
  <partner>
    <partnerNumber>100193</partnerNumber>
    <partnerFunction>RE</partnerFunction>
  </partner>
  <materialsAvailibility>
    <itemNumber>110</itemNumber>
    <materialNumber>188521</materialNumber>
  </materialsAvailibility>
</root>

Payload 2

<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <header>
    <quoteType>YQT</quoteType>
    <salesOrg>5010</salesOrg>
    <distributionChannel>00</distributionChannel>
    <division>00</division>
    <deliveryDateHeader>2022-09-29T00:00Z</deliveryDateHeader>
    <shippingCondition>01</shippingCondition>
  </header>
  <partner>
    <partnerNumber>100193</partnerNumber>
    <partnerFunction>SP</partnerFunction>
  </partner>
  <partner>
    <partnerNumber>100193</partnerNumber>
    <partnerFunction>WE</partnerFunction>
  </partner>
  <partner>
    <partnerNumber>100193</partnerNumber>
    <partnerFunction>RE</partnerFunction>
  </partner>
  <materialsAvailibility>
    <itemNumber>10</itemNumber>
    <materialNumber>115517</materialNumber>
  </materialsAvailibility>
</root>

期望输出

<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <header>
    <quoteType>YQT</quoteType>
    <salesOrg>5010</salesOrg>
    <distributionChannel>00</distributionChannel>
    <division>00</division>
    <deliveryDateHeader>2022-09-29T00:00Z</deliveryDateHeader>
    <shippingCondition>01</shippingCondition>
  </header>
  <partner>
    <partnerNumber>100193</partnerNumber>
    <partnerFunction>SP</partnerFunction>
  </partner>
  <partner>
    <partnerNumber>100193</partnerNumber>
    <partnerFunction>WE</partnerFunction>
  </partner>
  <partner>
    <partnerNumber>100193</partnerNumber>
    <partnerFunction>RE</partnerFunction>
  </partner>
  <materialsAvailibility>
    <itemNumber>110</itemNumber>
    <materialNumber>188521</materialNumber>
  </materialsAvailibility>
  <materialsAvailibility>
    <itemNumber>10</itemNumber>
    <materialNumber>115517</materialNumber>
  </materialsAvailibility>
</root>

XSLT代码及解释

可运行XSLT代码(XSLT 1.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="/">
    <root>
      <!-- 复制第一个输入XML的header节点 -->
      <xsl:copy-of select="root/header"/>
      <!-- 复制第一个输入XML的所有partner节点 -->
      <xsl:copy-of select="root/partner"/>
      <!-- 加载所有目标XML,遍历并复制materialsAvailibility节点 -->
      <xsl:for-each select="document('payload1.xml')/root/materialsAvailibility | document('payload2.xml')/root/materialsAvailibility">
        <xsl:copy-of select="."/>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

代码逐行解释

  • <xsl:stylesheet>:声明XSLT版本和标准命名空间,是XSLT文档的根元素。
  • <xsl:template match="/">:匹配输入XML的根节点,是转换逻辑的入口。
  • <root>:构建输出的根节点,与输入结构保持一致。
  • <xsl:copy-of select="root/header"/>:将第一个输入XML中的header节点完整复制到输出。
  • <xsl:copy-of select="root/partner"/>:将第一个输入XML中的所有partner节点完整复制到输出。
  • <xsl:for-each>:通过document()函数加载外部XML文件(需替换为实际文件路径),用|运算符合并多个文件的materialsAvailibility节点集并遍历。
  • <xsl:copy-of select="."/>:将当前遍历到的materialsAvailibility节点完整复制到输出。

简化版本(XSLT 2.0+)

如果使用支持XSLT 2.0及以上的处理器,且输入为多节点集,可使用更简洁的写法:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <root>
      <!-- 取第一个输入的header和partner节点 -->
      <xsl:copy-of select="root[1]/header | root[1]/partner"/>
      <!-- 取所有输入的materialsAvailibility节点 -->
      <xsl:copy-of select="root/materialsAvailibility"/>
    </root>
  </xsl:template>
</xsl:stylesheet>

内容的提问来源于stack exchange,提问作者Iri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:05:18