如何使用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>
代码说明
- Identity模板:XSLT基础模板,确保除
Detalle和Desglose外的所有XML内容(根节点、其他子节点、属性)原样保留。 - key定义:通过
detalleId属性将Desglose节点分组,处理Detalle时可快速通过key('desglose-group', @id)获取所有关联的Desglose。 - Detalle节点处理:复制
Detalle自身的属性和子节点后,插入匹配到的Desglose节点,实现嵌套效果。 - 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
相关产品推荐
相关产品推荐

