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

如何在XSLT中配对合并XML的Header与Detail数组节点?

解决方案:XSLT实现XML结构配对转换

原XML中Header和Detail是按顺序成对出现的,要实现一对一的包装,核心是通过节点位置关联对应的Header和Detail,而非嵌套遍历。以下是可行的XSLT代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <!-- 匹配根节点,生成目标根元素CreateInvoice -->
    <xsl:template match="/Root">
        <CreateInvoice>
            <!-- 遍历所有Header节点,每个Header对应一个Data块 -->
            <xsl:for-each select="Header">
                <Data>
                    <Invoice>
                        <!-- 复制当前Header下的所有子节点(这里是Inv) -->
                        <xsl:copy-of select="*"/>
                        <!-- 根据当前Header的位置,找到对应位置的Detail节点,包装成InvoiceLine -->
                        <InvoiceLine>
                            <xsl:copy-of select="../Detail[position() = current()/position()]/*"/>
                        </InvoiceLine>
                    </Invoice>
                </Data>
            </xsl:for-each>
        </CreateInvoice>
    </xsl:template>
</xsl:stylesheet>

关键逻辑说明

  • 遍历每个Header节点,每遍历一个就生成一个Data结构
  • 使用current()/position()获取当前Header的位置,通过../Detail[position() = ...]定位到同位置的Detail节点
  • 用<xsl:copy-of>直接复制节点内容,避免手动逐个映射字段,提升扩展性

测试验证

将原XML输入上述XSLT,会生成你需要的目标XML结构:

<CreateInvoice>
  <Data>
    <Invoice>
      <Inv>12</Inv>
      <InvoiceLine>
        <Val>aa</Val>
        <Line>1</Line>
      </InvoiceLine>
    </Invoice>
  </Data>
  <Data>
    <Invoice>
      <Inv>15</Inv>
      <InvoiceLine>
        <Val>bb</Val>
        <Line>2</Line>
      </InvoiceLine>
    </Invoice>
  </Data>
</CreateInvoice>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:05:19