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

如何使用XSLT将XML中Desglose节点分组嵌套至对应Detalle节点内

正确的XSLT实现方案:将Desglose节点嵌套到关联Detalle节点内部

典型输入XML结构(可根据实际结构调整关联字段)

<Factura>
  <Detalle id="D001">
    <Producto>Laptop</Producto>
    <Cantidad>1</Cantidad>
  </Detalle>
  <Desglose detalleId="D001">
    <Concepto>Precio base</Concepto>
    <Monto>999.99</Monto>
  </Desglose>
  <Desglose detalleId="D001">
    <Concepto>Impuesto IVA</Concepto>
    <Monto>199.99</Monto>
  </Desglose>
  <Detalle id="D002">
    <Producto>Mouse</Producto>
    <Cantidad>2</Cantidad>
  </Detalle>
  <Desglose detalleId="D002">
    <Concepto>Precio unitario</Concepto>
    <Monto>29.99</Monto>
  </Desglose>
</Factura>

最终XSLT代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Identity模板:复制所有未特殊处理的节点和属性,保留原有XML结构 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 定义key:按Desglose的detalleId属性分组,快速关联到对应的Detalle -->
  <xsl:key name="desglose-group" match="Desglose" use="@detalleId"/>

  <!-- 处理Detalle节点:复制自身后,插入所有关联的Desglose -->
  <xsl:template match="Detalle">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
      <!-- 插入当前Detalle对应的所有Desglose节点 -->
      <xsl:apply-templates select="key('desglose-group', @id)"/>
    </xsl:copy>
  </xsl:template>

  <!-- 隐藏原位置的Desglose节点,避免重复输出 -->
  <xsl:template match="Desglose"/>
</xsl:stylesheet>

代码说明

  1. Identity模板:XSLT基础模板,确保除Detalle和Desglose外的所有XML内容(根节点、其他子节点、属性)原样保留。
  2. key定义:通过detalleId属性将Desglose节点分组,处理Detalle时可快速通过key('desglose-group', @id)获取所有关联的Desglose。
  3. Detalle节点处理:复制Detalle自身的属性和子节点后,插入匹配到的Desglose节点,实现嵌套效果。
  4. Desglose节点隐藏:单独匹配Desglose节点并做空处理,避免原XML中Detalle外部的Desglose重复输出。

转换后的输出效果

<Factura>
  <Detalle id="D001">
    <Producto>Laptop</Producto>
    <Cantidad>1</Cantidad>
    <Desglose detalleId="D001">
      <Concepto>Precio base</Concepto>
      <Monto>999.99</Monto>
    </Desglose>
    <Desglose detalleId="D001">
      <Concepto>Impuesto IVA</Concepto>
      <Monto>199.99</Monto>
    </Desglose>
  </Detalle>
  <Detalle id="D002">
    <Producto>Mouse</Producto>
    <Cantidad>2</Cantidad>
    <Desglose detalleId="D002">
      <Concepto>Precio unitario</Concepto>
      <Monto>29.99</Monto>
    </Desglose>
  </Detalle>
</Factura>

自定义调整说明

如果你的XML关联字段不是id和detalleId,只需修改两处:

  • key的use属性:改成Desglose中关联Detalle的字段,比如use="DetalleId"(适配属性名大小写差异)
  • Detalle模板中的key参数:改成Detalle对应的关联字段,比如key('desglose-group', @DetalleId)

内容的提问来源于stack exchange,提问作者Antonio David Marín Gutiérrez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:20:28