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

