控制 XML 处理中的数据流

问题描述 投票:0回答:1

我们使用 XSLT 将业务数据从 XML 映射到 XML,并且无需 Web 参与。我需要获取 XML 输入并输出相同的数据,并将某些类型的多次出现的记录合并为一个。过程语言中的简单内容却让 XSLT 难住了。

此代码就是我们现在所拥有的,除了 2 种记录类型之外,XML 的输出没有任何更改。这非常有效,我们向 E2EDT37 和 E2EDT43 记录添加了新元素。代码格式对我不起作用,所以我改为引用。

xsl:选择 xsl:否则 xsl:选择

这是数据。每个E2EDT37记录代表一个纸箱,每个E2EDT43是纸箱的内容。在最后一个 E2EDT37 中,我们有 2 个 E2EDT43 记录,当一个纸箱中有两种零件类型时,这是正常的。但在这里,我们从 E2EDT43_VBELN 和 E2EDT43_POSNR 中看到,这两种情况下都是相同的行项目。 hgave =0060088483 和 =000010 因此应该合并。

第一个 E2EDT43 显示数量 (E2EDT43_VEMNG) 为 1,第二个显示 177。因此,我们确实有一个 178 的行项目被 SAP 以某种方式分割,我需要将它们合并到一个总数量为 178 的 E2EDT43 中。

E2EDT38 不相关,可以从输出中排除或按原样复制。

EDI_DC40 100 0000008142818069 20230914 214255 20230914214254 E2EDT20002 100 0000008142818069 000001 000000 01 1200447887 Y008 E2EDT37006 100 0000008142818069 000020 000001 00340051082800455472 0845550170000#E EWM-VERSANDPALETTE 20KG-9990088889 S E2EDT38000 100 0000008142818069 000021 000020 03 消耗品包装 EWM-VERSANDPALETTE 20KG-9990088889 E2EDT43005 100 0000008142818069 000022 000020 1 0060085134 000010 80.000 PCE 089627903000005 AAM0000000 E2EDT37006 100 0000008142818069 000023 000001 00340051082800455496 0845550170000#E EWM-VERSANDPALETTE 20KG-9990088889 S E2EDT38000 100 0000008142818069 000024 000023 03 消耗品包装 EWM-VERSANDPALETTE 20KG-9990088889 E2EDT43005 100 0000008142818069 000025 000023 03 1 0060085134 000010 80.000 PCE 089627903000005 AAM0000000 E2EDT37006 100 0000008142818069 000026 000001 00340051082800455625 0845550170000#E EWM-VERSANDPALETTE 20KG-9990088889 S E2EDT38000 100 0000008142818069 000027 000026 03 消耗品包装 EWM-VERSANDPALETTE 20KG-9990088889 E2EDT43005 100 0000008142818069 000028 000026 03 1 0060088483 000010 1.000 PCE 089136322000005 AAM0000000 E2EDT43005 100 0000008142818069 000029 000026 03 1 0060088483 000010 177.000 PCE 089136322000005 AAM0000000

我想我应该更改代码来检测包含 E2EDT37 和 E2EDT43 记录的 G07 组。我将复制 E2EDT37 并添加一些元素,就像我们现在所做的那样。然后继续复制 E2EDT38 不变,然后执行例程来检查 E2EDT43 是否需要合并并创建输出。

但是,一旦我将 G07 传递到 E2EDT37 模板,如何复制 E2EDT38,然后在 G07 中处理 E2EDT43?从模板 E2EDT37 返回后,如何恢复数据流?只是为了简单起见,E2EDT37 模板现在不执行任何操作,并且 E2EDT37_ADDITIONAL_SEG 被注释掉。

xsl:选择

下面是我现在得到的。它创建 E2EDT37 元素,但随后字段都位于连续的字符流中。在我检测到 G07 并调用模板后,我似乎失去了上下文,不知道如何解决这个问题。 E2EDT38 已创建,但 E2EDT43 完全丢失。代码示例固然很好,但了解如何使用数据流才是我真正需要学习的。任何对书籍或文章的参考都可以。也许是“面向过程编程傻瓜的 XSLT 处理概念”?

xml xslt edi
1个回答
0
投票

使用以下 Powershell 脚本。需要使用父节点来获取数据。我创建一个父节点Root来获取结果

这是 XML 文件

<Root>
    <E2EDT20_SEGNAM>E2EDT20002</E2EDT20_SEGNAM>
    <E2EDT20_MANDT>100</E2EDT20_MANDT>
    <E2EDT20_DOCNUM>0000008142818069</E2EDT20_DOCNUM>
    <E2EDT20_SEGNUM>000001</E2EDT20_SEGNUM>
    <E2EDT20_PSGNUM>000000</E2EDT20_PSGNUM>
    <E2EDT20_HLEVEL>01</E2EDT20_HLEVEL>
    <E2EDT20_TKNUM>1200447887</E2EDT20_TKNUM>
    <E2EDT20_SHTYP>Y008</E2EDT20_SHTYP>
    <E2EDT37_SEGNAM>E2EDT37006</E2EDT37_SEGNAM>
    <E2EDT37_MANDT>100</E2EDT37_MANDT>
    <E2EDT37_DOCNUM>0000008142818069</E2EDT37_DOCNUM>
    <E2EDT37_SEGNUM>000020</E2EDT37_SEGNUM>
    <E2EDT37_PSGNUM>000001</E2EDT37_PSGNUM>
    <E2EDT37_EXIDV>00340051082800455472</E2EDT37_EXIDV>
    <E2EDT37_VHILM>0845550170000 #E</E2EDT37_VHILM>
    <E2EDT37_VEBEZ>EWM-VERSANDPALETTE 20KG-9990088889</E2EDT37_VEBEZ>
    <E2EDT37_SMGKN>S</E2EDT37_SMGKN>
    <E2EDT38_SEGNAM>E2EDT38000</E2EDT38_SEGNAM>
    <E2EDT38_MANDT>100</E2EDT38_MANDT>
    <E2EDT38_DOCNUM>0000008142818069</E2EDT38_DOCNUM>
    <E2EDT38_SEGNUM>000021</E2EDT38_SEGNUM>
    <E2EDT38_PSGNUM>000020</E2EDT38_PSGNUM>
    <E2EDT38_HLEVEL>03</E2EDT38_HLEVEL>
    <E2EDT38_VHART_BEZ>expendable packaging</E2EDT38_VHART_BEZ>
    <E2EDT38_VEBEZ>EWM-VERSANDPALETTE 20KG-9990088889</E2EDT38_VEBEZ>
    <E2EDT43_SEGNAM>E2EDT43005</E2EDT43_SEGNAM>
    <E2EDT43_MANDT>100</E2EDT43_MANDT>
    <E2EDT43_DOCNUM>0000008142818069</E2EDT43_DOCNUM>
    <E2EDT43_SEGNUM>000022</E2EDT43_SEGNUM>
    <E2EDT43_PSGNUM>000020</E2EDT43_PSGNUM>
    <E2EDT43_VELIN>1</E2EDT43_VELIN>
    <E2EDT43_VBELN>0060085134</E2EDT43_VBELN>
    <E2EDT43_POSNR>000010</E2EDT43_POSNR>
    <E2EDT43_VEMNG>80.000</E2EDT43_VEMNG>
    <E2EDT43_VEMEH>PCE</E2EDT43_VEMEH>
    <E2EDT43_MATNR>089627903000005</E2EDT43_MATNR>
    <E2EDT43_CHARG>AAM0000000</E2EDT43_CHARG>
    <E2EDT37_SEGNAM>E2EDT37006</E2EDT37_SEGNAM>
    <E2EDT37_MANDT>100</E2EDT37_MANDT>
    <E2EDT37_DOCNUM>0000008142818069</E2EDT37_DOCNUM>
    <E2EDT37_SEGNUM>000023</E2EDT37_SEGNUM>
    <E2EDT37_PSGNUM>000001</E2EDT37_PSGNUM>
    <E2EDT37_EXIDV>00340051082800455496</E2EDT37_EXIDV>
    <E2EDT37_VHILM>0845550170000 #E</E2EDT37_VHILM>
    <E2EDT37_VEBEZ>EWM-VERSANDPALETTE 20KG-9990088889</E2EDT37_VEBEZ>
    <E2EDT37_SMGKN>S</E2EDT37_SMGKN>
    <E2EDT38_SEGNAM>E2EDT38000</E2EDT38_SEGNAM>
    <E2EDT38_MANDT>100</E2EDT38_MANDT>
    <E2EDT38_DOCNUM>0000008142818069</E2EDT38_DOCNUM>
    <E2EDT38_SEGNUM>000024</E2EDT38_SEGNUM>
    <E2EDT38_PSGNUM>000023</E2EDT38_PSGNUM>
    <E2EDT38_HLEVEL>03</E2EDT38_HLEVEL>
    <E2EDT38_VHART_BEZ>expendable packaging</E2EDT38_VHART_BEZ>
    <E2EDT38_VEBEZ>EWM-VERSANDPALETTE 20KG-9990088889</E2EDT38_VEBEZ>
    <E2EDT43_SEGNAM>E2EDT43005</E2EDT43_SEGNAM>
    <E2EDT43_MANDT>100</E2EDT43_MANDT>
    <E2EDT43_DOCNUM>0000008142818069</E2EDT43_DOCNUM>
    <E2EDT43_SEGNUM>000025</E2EDT43_SEGNUM>
    <E2EDT43_PSGNUM>000023</E2EDT43_PSGNUM>
    <E2EDT43_HLEVEL>03</E2EDT43_HLEVEL>
    <E2EDT43_VELIN>1</E2EDT43_VELIN>
    <E2EDT43_VBELN>0060085134</E2EDT43_VBELN>
    <E2EDT43_POSNR>000010</E2EDT43_POSNR>
    <E2EDT43_VEMNG>80.000</E2EDT43_VEMNG>
    <E2EDT43_VEMEH>PCE</E2EDT43_VEMEH>
    <E2EDT43_MATNR>089627903000005</E2EDT43_MATNR>
    <E2EDT43_CHARG>AAM0000000</E2EDT43_CHARG>
    <E2EDT37_SEGNAM>E2EDT37006</E2EDT37_SEGNAM>
    <E2EDT37_MANDT>100</E2EDT37_MANDT>
    <E2EDT37_DOCNUM>0000008142818069</E2EDT37_DOCNUM>
    <E2EDT37_SEGNUM>000026</E2EDT37_SEGNUM>
    <E2EDT37_PSGNUM>000001</E2EDT37_PSGNUM>
    <E2EDT37_EXIDV>00340051082800455625</E2EDT37_EXIDV>
    <E2EDT37_VHILM>0845550170000 #E</E2EDT37_VHILM>
    <E2EDT37_VEBEZ>EWM-VERSANDPALETTE 20KG-9990088889</E2EDT37_VEBEZ>
    <E2EDT37_SMGKN>S</E2EDT37_SMGKN>
    <E2EDT38_SEGNAM>E2EDT38000</E2EDT38_SEGNAM>
    <E2EDT38_MANDT>100</E2EDT38_MANDT>
    <E2EDT38_DOCNUM>0000008142818069</E2EDT38_DOCNUM>
    <E2EDT38_SEGNUM>000027</E2EDT38_SEGNUM>
    <E2EDT38_PSGNUM>000026</E2EDT38_PSGNUM>
    <E2EDT38_HLEVEL>03</E2EDT38_HLEVEL>
    <E2EDT38_VHART_BEZ>expendable packaging</E2EDT38_VHART_BEZ>
    <E2EDT38_VEBEZ>EWM-VERSANDPALETTE 20KG-9990088889</E2EDT38_VEBEZ>
    <E2EDT43_SEGNAM>E2EDT43005</E2EDT43_SEGNAM>
    <E2EDT43_MANDT>100</E2EDT43_MANDT>
    <E2EDT43_DOCNUM>0000008142818069</E2EDT43_DOCNUM>
    <E2EDT43_SEGNUM>000028</E2EDT43_SEGNUM>
    <E2EDT43_PSGNUM>000026</E2EDT43_PSGNUM>
    <E2EDT43_HLEVEL>03</E2EDT43_HLEVEL>
    <E2EDT43_VELIN>1</E2EDT43_VELIN>
    <E2EDT43_VBELN>0060088483</E2EDT43_VBELN>
    <E2EDT43_POSNR>000010</E2EDT43_POSNR>
    <E2EDT43_VEMNG>1.000</E2EDT43_VEMNG>
    <E2EDT43_VEMEH>PCE</E2EDT43_VEMEH>
    <E2EDT43_MATNR>089136322000005</E2EDT43_MATNR>
    <E2EDT43_CHARG>AAM0000000</E2EDT43_CHARG>
    <E2EDT43_SEGNAM>E2EDT43005</E2EDT43_SEGNAM>
    <E2EDT43_MANDT>100</E2EDT43_MANDT>
    <E2EDT43_DOCNUM>0000008142818069</E2EDT43_DOCNUM>
    <E2EDT43_SEGNUM>000029</E2EDT43_SEGNUM>
    <E2EDT43_PSGNUM>000026</E2EDT43_PSGNUM>
    <E2EDT43_HLEVEL>03</E2EDT43_HLEVEL>
    <E2EDT43_VELIN>1</E2EDT43_VELIN>
    <E2EDT43_VBELN>0060088483</E2EDT43_VBELN>
    <E2EDT43_POSNR>000010</E2EDT43_POSNR>
    <E2EDT43_VEMNG>177.000</E2EDT43_VEMNG>
    <E2EDT43_VEMEH>PCE</E2EDT43_VEMEH>
    <E2EDT43_MATNR>089136322000005</E2EDT43_MATNR>
    <E2EDT43_CHARG>AAM0000000</E2EDT43_CHARG>
</Root>

这是 Powershell 脚本

using assembly System.Xml.Linq

$inputFilename = 'c:\temp\test.xml'
$outputFilename = 'c:\temp\test1.xml'

$doc = [System.Xml.Linq.XDocument]::Load($inputFilename)

$root = $doc.Descendants('Root')[0]
$elements = $root.Elements();

$groups = [System.Linq.Enumerable]::GroupBy($elements,  [Func[object,object]]{ param($x) $x[0].Name.LocalName})


$distinct = [Linq.Enumerable]::Select($groups, [Func[object,object]] { param($x) $x[0] })
$orderNodes = [Linq.Enumerable]::OrderBy($distinct, [Func[object,object]] { param($x) $x[0].Name.LocalName })

$root.RemoveNodes()
foreach($node in $orderNodes)
{
   $root.Add($node)
}
$doc.Save($outputFilename)
© www.soinside.com 2019 - 2024. All rights reserved.