如何使用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
相关产品推荐
相关产品推荐

