基于ABLAD/VKORG值变化为E1EDL20添加包装元素的XSLT需求
修正XSLT实现按ABLAD+VKORG分组包装E1EDL20元素
核心思路
要实现ABLAD字段值变化或VKORG值更新时,为E1EDL20生成独立GROUPBY父元素,核心是用Muenchian分组,把ABLAD和VKORG的组合作为分组键——只要其中任意一个字段值变化,分组键就会不同,自然触发新分组。
修正后的XSLT代码
假设你的源XML结构包含多个E1EDL20节点,每个节点下有E1EDL19子节点存储ABLAD和VKORG值,修正后的代码如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 定义分组键:组合ABLAD和VKORG,确保任一值变化则分组不同 --> <xsl:key name="groupKey" match="E1EDL20" use="concat(E1EDL19/ABLAD, '|', E1EDL19/VKORG)"/> <xsl:template match="/"> <ROOT> <!-- 遍历每个分组的第一个E1EDL20节点 --> <xsl:for-each select="ROOT/E1EDL20[generate-id() = generate-id(key('groupKey', concat(E1EDL19/ABLAD, '|', E1EDL19/VKORG))[1])]"> <!-- 生成GROUPBY父元素 --> <GROUPBY> <!-- 输出当前分组下的所有E1EDL20节点 --> <xsl:copy-of select="key('groupKey', concat(E1EDL19/ABLAD, '|', E1EDL19/VKORG))"/> </GROUPBY> </xsl:for-each> </ROOT> </xsl:template> </xsl:stylesheet>
关键说明
- 分组键定义:用
concat(E1EDL19/ABLAD, '|', E1EDL19/VKORG)作为分组键,|是分隔符(避免两个字段值拼接后产生歧义,比如ABLAD是"01"、VKORG是"00"和ABLAD是"0"、VKORG是"100"的情况)。 - 分组筛选:通过
generate-id()判断当前节点是否是对应分组的第一个节点,确保每个分组只生成一个GROUPBY父元素。 - 节点复制:用
xsl:copy-of把当前分组下所有E1EDL20节点完整复制到GROUPBY内部。
测试验证
如果源XML包含以下节点:
<ROOT> <E1EDL20> <E1EDL19><ABLAD>20240501</ABLAD><VKORG>0100</VKORG></E1EDL19> <!-- 其他子节点 --> </E1EDL20> <E1EDL20> <E1EDL19><ABLAD>20240501</ABLAD><VKORG>0100</VKORG></E1EDL19> <!-- 其他子节点 --> </E1EDL20> <E1EDL20> <E1EDL19><ABLAD>20240502</ABLAD><VKORG>0200</VKORG></E1EDL19> <!-- 其他子节点 --> </E1EDL20> </ROOT>
输出会生成两个独立的GROUPBY分组:
<ROOT> <GROUPBY> <E1EDL20> <E1EDL19><ABLAD>20240501</ABLAD><VKORG>0100</VKORG></E1EDL19> <!-- 其他子节点 --> </E1EDL20> <E1EDL20> <E1EDL19><ABLAD>20240501</ABLAD><VKORG>0100</VKORG></E1EDL19> <!-- 其他子节点 --> </E1EDL20> </GROUPBY> <GROUPBY> <E1EDL20> <E1EDL19><ABLAD>20240502</ABLAD><VKORG>0200</VKORG></E1EDL19> <!-- 其他子节点 --> </E1EDL20> </GROUPBY> </ROOT>
这样就能确保VKORG=0100和VKORG=0200的E1EDL20被分别包装到独立的GROUPBY中,满足SAP PO的分组需求。
内容的提问来源于stack exchange,提问作者Mike Dole
相关产品推荐
相关产品推荐

