xml - 如何在订单行内的供应商代码上对 XML 进行分组?
问题描述
我有一个 XML 输入,想通过 xslt 文件为我们的 ERP 系统翻译这个 xml。我想做的是对供应商代码进行分组。因此,我希望每个供应商代码都有 1 个 iorh,而该 iorh 的所有 iorr。
XML 输入:
<NewDataSet>
<OrderLine>
<SUPPLIER_CODE>01</SUPPLIER_CODE>
<ITEM_CODE>xxx</ITEM_CODE>
<ITEM_DESCRIPTION>xxx</ITEM_DESCRIPTION>
<ORDER_QTY>2.00</ORDER_QTY>
</OrderLine>
<OrderLine>
<SUPPLIER_CODE>01</SUPPLIER_CODE>
<ITEM_CODE>yyy</ITEM_CODE>
<ITEM_DESCRIPTION>yyy</ITEM_DESCRIPTION>
<ORDER_QTY>3.00</ORDER_QTY>
</OrderLine>
<OrderLine>
<SUPPLIER_CODE>02</SUPPLIER_CODE>
<ITEM_CODE>zzz</ITEM_CODE>
<ITEM_DESCRIPTION>zzz</ITEM_DESCRIPTION>
<ORDER_QTY>1.00</ORDER_QTY>
</OrderLine>
<OrderLine>
<SUPPLIER_CODE>02</SUPPLIER_CODE>
<ITEM_CODE>uuu</ITEM_CODE>
<ITEM_DESCRIPTION>uuuu</ITEM_DESCRIPTION>
<ORDER_QTY>2.00</ORDER_QTY>
</OrderLine>
<OrderLine>
<SUPPLIER_CODE>03</SUPPLIER_CODE>
<ITEM_CODE>vvv</ITEM_CODE>
<ITEM_DESCRIPTION>vvv</ITEM_DESCRIPTION>
<ORDER_QTY>2.00</ORDER_QTY>
</OrderLine>
XSLT:
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<DataSet>
<xsl:for-each select="NewDataSet/OrderLine">
<xsl:sort select="SUPPLIER_CODE"/>
<iorh>
<iorh.cred_num>
<xsl:value-of select="SUPPLIER_CODE"/>
</iorh.cred_num>
<iorr>
<iorr.arti_code>
<xsl:value-of select="ITEM_CODE"/>
</iorr.arti_code>
<iorr.iorr_oms_1>
<xsl:value-of select="ITEM_CODE"/>
</iorr.iorr_oms_1>
<iorr.iorr_oms_2>
<xsl:value-of select="ITEM_DESCRIPTION"/>
</iorr.iorr_oms_2>
<iorr.iorr_order_aantal>
<xsl:value-of select="ORDER_QTY"/>
</iorr.iorr_order_aantal>
</iorr>
</iorh>
</xsl:for-each>
</DataSet>
</xsl:template>
</xsl:stylesheet>
我想要的 XML 输出:
<DataSet>
<iorh> //1x for every SUPPLIER_CODE
<iorh.cred_num>
01
</iorh.cred_num>
</iorh>
<iorr>
<iorr.arti_code>
xxx
</iorr.arti_code>
<iorr.iorr_oms_1>
xxx
</iorr.iorr_oms_1>
<iorr.iorr_oms_2>
xxx
</iorr.iorr_oms_2>
<iorr.iorr_order_aantal>
2.00
</iorr.iorr_order_aantal>
</iorr>
<iorr>
<iorr.arti_code>
yyy
</iorr.arti_code>
<iorr.iorr_oms_1>
yyy
</iorr.iorr_oms_1>
<iorr.iorr_oms_2>
yyy
</iorr.iorr_oms_2>
<iorr.iorr_order_aantal>
3.00
</iorr.iorr_order_aantal>
</iorr>
<iorh> //1x for every SUPPLIER_CODE
<iorh.cred_num>
02
</iorh.cred_num>
</iorh>
<iorr>
<iorr.arti_code>
vvv
</iorr.arti_code>
<iorr.iorr_oms_1>
vvv
</iorr.iorr_oms_1>
<iorr.iorr_oms_2>
vvv
</iorr.iorr_oms_2>
<iorr.iorr_order_aantal>
2.00
</iorr.iorr_order_aantal>
</iorr>
.....................................
</DataSet>
我现在为每个新的供应商代码/订单行获取一个新的 iorh。谁能告诉/解释我如何做到这一点/有可能做到这一点吗?希望你明白。
解决方案
用作按供应商xsl:key
代码分组的参考。
<xsl:key use="SUPPLIER_CODE" match="/NewDataSet/OrderLine" name="groups"/>
<xsl:template match="/">
<xsl:apply-templates select="/NewDataSet" />
</xsl:template>
<xsl:template match="/NewDataSet">
<DataSet>
<xsl:for-each select="OrderLine[generate-id(.)=generate-id(key('groups',SUPPLIER_CODE))]">
<xsl:sort select="SUPPLIER_CODE"/>
<iorh>
<iorh.cred_num>
<xsl:value-of select="SUPPLIER_CODE"/>
</iorh.cred_num>
<xsl:for-each select="key('groups',SUPPLIER_CODE)">
<iorr>
<iorr.arti_code>
<xsl:value-of select="ITEM_CODE"/>
</iorr.arti_code>
<iorr.iorr_oms_1>
<xsl:value-of select="ITEM_CODE"/>
</iorr.iorr_oms_1>
<iorr.iorr_oms_2>
<xsl:value-of select="ITEM_DESCRIPTION"/>
</iorr.iorr_oms_2>
<iorr.iorr_order_aantal>
<xsl:value-of select="ORDER_QTY"/>
</iorr.iorr_order_aantal>
</iorr>
</xsl:for-each>
</iorh>
</xsl:for-each>
<DataSet>
</xsl:template>
推荐阅读
- vue.js - 如何在带有 vue.js 的离子电容器中使用 Cordova 插件
- python - 使用 csvdir 将 csv 数据摄取到 zipline 时解析错误
- javascript - 无法读取未定义的属性“路线”
- varnish - Varnish 添加带有服务器 IP 的 HTTP 标头
- ios - 是否可以从应用商店下载构建版本?
- canvas - 哪些是访问图像像素数据的不同方式并且可以替换该数据?
- android - 如何在 OpenGL ES 和 Vulkan 之间传递纹理?
- r - How to sample cell from one of two columns?
- python - 如何在python中将一列秒添加到一列时间?
- ansible - 如何在没有错误的情况下收集ansible中的文件夹列表?