gpt4 book ai didi

XSLT muenchian 在子节点中按值分组

转载 作者:行者123 更新时间:2023-12-04 08:47:09 25 4
gpt4 key购买 nike

我正在尝试使用用 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>
如您所见,我需要按 E2EDL43000[QUALF='C']/BELNR 对 E2EDL24007GRP 进行分组。
我尝试了以下 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>

但它根本不起作用,有什么想法吗?

最佳答案

以下样式表:
XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://example.com">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

<xsl:key name="k" match="E2EDL24007GRP" use="E2EDL43000/BELNR" />

<xsl:template match="/Receive">
<ns0:Root>
<xsl:for-each select="idocData/E2EDL20003GRP">
<RecordA>
<ID>
<xsl:value-of select="E2EDL2003/ParentValue" />
</ID>
<xsl:for-each select="E2EDL24007GRP[generate-id()=generate-id(key('k', E2EDL43000/BELNR)[1])]">
<RecordB>
<ID>
<xsl:value-of select="E2EDL43000/BELNR" />
</ID>
<xsl:for-each select="key('k', E2EDL43000/BELNR)">
<RecordC>
<Value>
<xsl:value-of select="E2EDL24007/ChildValue" />
</Value>
</RecordC>
</xsl:for-each>
</RecordB>
</xsl:for-each>
</RecordA>
</xsl:for-each>
</ns0:Root>
</xsl:template>

</xsl:stylesheet>
应用于您的输入示例,将产生:
结果
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Root xmlns:ns0="http://example.com">
<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>

注意 :
  • 您的输入示例没有命名空间;
  • 您的输出具有未绑定(bind)到命名空间的前缀,这是不允许的;我使用了一个虚假的 namespace 来生成一个格式良好的 XML 文档。
  • 关于XSLT muenchian 在子节点中按值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64258044/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com