【发布时间】:2021-01-23 05:40:32
【问题描述】:
我正在尝试使用用 xslt 编写的 BizTalk 映射将 sap iDoc 转换为另一个 xml 文件。问题是我需要根据我们可以在特定子节点中找到的值对节点进行分组。
Muenchian 分组(我使用 XSLT 1.0)似乎是解决方案,但我不知道如何使其工作,因为我需要对子节点值进行分组。
<Receive>
<idocData>
<E2EDL20003GRP>
<E2EDL2003>
<ParentValue>PV</ParentValue>
</E2EDL2003>
...
<E2EDL24007GRP>
<E2EDL24007>
<ChildValue>CHV1</ChildValue>
</E2EDL24007>
<E2EDL43000>
<QUALF>C</QUALF>
<BELNR>0000045690</BELNR>
</E2EDL43000>
...
</E2EDL24007GRP>
<E2EDL24007GRP>
<E2EDL24007>
<ChildValue>CHV2</ChildValue>
</E2EDL24007>
<E2EDL43000>
<QUALF>C</QUALF>
<BELNR>0000045690</BELNR>
</E2EDL43000>
...
</E2EDL24007GRP>
<E2EDL24007GRP>
<E2EDL24007>
<ChildValue>CHV3</ChildValue>
</E2EDL24007>
<E2EDL43000>
<QUALF>C</QUALF>
<BELNR>0000045691</BELNR>
</E2EDL43000>
...
</E2EDL24007GRP>
</E2EDL20003GRP>
</idocData>
</Receive>
应用 XSLT 转换后,我正在寻找的是:
<ns0:Root>
<RecordA>
<ID>PV</ID>
<RecordB>
<ID>0000045690</ID>
<RecordC>
<Value>CHV1</Value>
</RecordC>
<RecordC>
<Value>CHV2</Value>
</RecordC>
</RecordB>
<RecordB>
<ID>0000045691</ID>
<RecordC>
<Value>CHV3</Value>
</RecordC>
</RecordB>
</RecordA>
</ns0:Root>
如您所见,我需要将 E2EDL24007GRP 按E2EDL43000[QUALF='C']/BELNR 分组。
我尝试了以下 muenchian 分组:
<xsl:key name="command" match="s0:E2EDL24007GRP" use="s0:E2EDL43000[s0:QUALF='C']/s0:BELNR" />
<xsl:template match="/">
<xsl:apply-templates select="/s1:Receive" />
</xsl:template>
<xsl:template match="/s1:Receive/s1:idocData">
<xsl:for-each select="s0:E2EDL20003GRP">
<ns0:Root>
<!-- Record A -->
<RecordA>
<ID>
<xsl:value-of select="s0:E2EDL2003/s0:ParentValue" />
</ID>
<xsl:apply-templates select="s0:E2EDL24007GRP[generate-id()=generate-id(key('command',s0:E2EDL43000[s0:QUALF='C']/s0:BELNR)[1])]"/>
</RecordA>
</ns0:Root>
</xsl:for-each>
</xsl:template>
<xsl:template match="E2EDL24007GRP">
...
</xsl:template>
但它根本不起作用,有什么想法吗?
【问题讨论】:
-
E2EDL20003GRP可以有多个吗?如果是,两个E2EDL24007GRP元素是否可以具有相同的BELNR值但属于不同的E2EDL20003GRP父母? -
否,如果有多个 E2EDL20003GRP(这将非常罕见),则 BELNR 值将不同。它们只能在同一个 E2EDL20003GR 中相同。
标签: xslt xslt-1.0 biztalk muenchian-grouping biztalk-mapper