请求实现合并多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
相关产品推荐
相关产品推荐

