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

如何使用XSLT 3.0基于节点值(RoleCode='Y1')拆分XML?

XSLT 3.0 按Party节点RoleCode拆分文档示例

下面是符合需求的XSLT 3.0转换实现,核心逻辑是针对每个RoleCode为Y1的<Party>节点,生成独立的<SalesOrderRequest>,同时保留原文档中所有非Y1的<Party>节点及其他内容。

输入XML示例

<SalesOrderRequest>
  <!-- 非Y1角色的Party节点 -->
  <Party>
    <RoleCode>Y2</RoleCode>
    <Name>供应商A</Name>
  </Party>
  <Party>
    <RoleCode>Y3</RoleCode>
    <Name>物流商B</Name>
  </Party>
  <!-- 需要拆分的Y1角色Party节点 -->
  <Party>
    <RoleCode>Y1</RoleCode>
    <Name>客户X</Name>
  </Party>
  <Party>
    <RoleCode>Y1</RoleCode>
    <Name>客户Y</Name>
  </Party>
  <!-- 其他业务节点 -->
  <OrderInfo>
    <OrderNo>SO001</OrderNo>
    <Amount>1000</Amount>
  </OrderInfo>
</SalesOrderRequest>

XSLT 3.0转换代码

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 启用自动浅拷贝,无需手动复制未修改的节点 -->
  <xsl:mode on-no-match="shallow-copy"/>

  <!-- 匹配根节点,生成外层容器并拆分文档 -->
  <xsl:template match="/SalesOrderRequest">
    <SalesOrderRequestRequest>
      <!-- 遍历所有RoleCode为Y1的Party节点 -->
      <xsl:for-each select="Party[RoleCode='Y1']">
        <SalesOrderRequest>
          <!-- 复制所有非Y1的Party节点 -->
          <xsl:copy-of select="../Party[RoleCode!='Y1']"/>
          <!-- 复制当前遍历到的Y1 Party节点 -->
          <xsl:copy-of select="."/>
          <!-- 复制原文档中所有非Party类型的节点 -->
          <xsl:copy-of select="../*[not(self::Party)]"/>
        </SalesOrderRequest>
      </xsl:for-each>
    </SalesOrderRequestRequest>
  </xsl:template>
</xsl:stylesheet>

关键逻辑说明

  • <xsl:mode on-no-match="shallow-copy"/>:自动复制未被模板匹配的节点,大幅减少重复代码,只需要关注需要修改的部分
  • 根模板匹配原<SalesOrderRequest>,生成外层<SalesOrderRequestRequest>容器
  • 遍历每个RoleCode='Y1'的<Party>,为每个节点生成新的<SalesOrderRequest>,依次加入非Y1的Party、当前Y1的Party,以及其他业务节点

输出XML示例

<SalesOrderRequestRequest>
  <SalesOrderRequest>
    <Party>
      <RoleCode>Y2</RoleCode>
      <Name>供应商A</Name>
    </Party>
    <Party>
      <RoleCode>Y3</RoleCode>
      <Name>物流商B</Name>
    </Party>
    <Party>
      <RoleCode>Y1</RoleCode>
      <Name>客户X</Name>
    </Party>
    <OrderInfo>
      <OrderNo>SO001</OrderNo>
      <Amount>1000</Amount>
    </OrderInfo>
  </SalesOrderRequest>
  <SalesOrderRequest>
    <Party>
      <RoleCode>Y2</RoleCode>
      <Name>供应商A</Name>
    </Party>
    <Party>
      <RoleCode>Y3</RoleCode>
      <Name>物流商B</Name>
    </Party>
    <Party>
      <RoleCode>Y1</RoleCode>
      <Name>客户Y</Name>
    </Party>
    <OrderInfo>
      <OrderNo>SO001</OrderNo>
      <Amount>1000</Amount>
    </OrderInfo>
  </SalesOrderRequest>
</SalesOrderRequestRequest>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:34:53