通过 xslt 从源头重复考虑
duplicate consideration from source through xslt
输入数据:以下是从源中获取的输入数据。我们如何通过 XSLT 映射 SCPI 来实现,在此先感谢您,并期待您的回复。
我有以下问题(在这个领域经常讨论,但我仍然无法得到确切的解决方案):我有一个 XML 如下所示:
<orderHeader>
<distributionChannelCode>10</distributionChannelCode>
<orderItem>
<productCode>AQ7481-002-001</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-004</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-001</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-002</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-004</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-002</productCode>
</orderItem>
</orderHeader>
所需输出:
<orderHeader>
<distributionChannelCode>10</distributionChannelCode>
<orderItem>
<productCode>AQ7481-002-001</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-002</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-004</productCode>
</orderItem>
</orderHeader>
<orderHeader>
<distributionChannelCode>10</distributionChannelCode>
<orderItem>
<productCode>AQ7481-002-001</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-002</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
</orderHeader>
<orderHeader>
<distributionChannelCode>10</distributionChannelCode>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
</orderHeader>
我不确定我是否理解了其中的逻辑,但也许下面是按 productCode 对 orderItems 进行分组以确定哪个组具有最多的项目,然后输出尽可能多的 orderHeaders 以及每个组中的相应项目:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="orderHeader">
<xsl:variable name="groups" as="map(xs:string, element(orderItem)*)*">
<xsl:for-each-group select="orderItem" group-by="string(productCode)">
<xsl:map-entry key="current-grouping-key()" select="current-group()"/>
</xsl:for-each-group>
</xsl:variable>
<xsl:variable name="this" select="."/>
<xsl:variable name="max-items" select="max($groups!count(?*))"/>
<xsl:iterate select="1 to $max-items">
<orderHeader>
<xsl:copy-of
select="$this/distributionChannelCode,
$groups ! ?*[current()]"/>
</orderHeader>
</xsl:iterate>
</xsl:template>
</xsl:stylesheet>
输入数据:以下是从源中获取的输入数据。我们如何通过 XSLT 映射 SCPI 来实现,在此先感谢您,并期待您的回复。 我有以下问题(在这个领域经常讨论,但我仍然无法得到确切的解决方案):我有一个 XML 如下所示:
<orderHeader>
<distributionChannelCode>10</distributionChannelCode>
<orderItem>
<productCode>AQ7481-002-001</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-004</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-001</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-002</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-004</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-002</productCode>
</orderItem>
</orderHeader>
所需输出:
<orderHeader>
<distributionChannelCode>10</distributionChannelCode>
<orderItem>
<productCode>AQ7481-002-001</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-002</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-004</productCode>
</orderItem>
</orderHeader>
<orderHeader>
<distributionChannelCode>10</distributionChannelCode>
<orderItem>
<productCode>AQ7481-002-001</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-002</productCode>
</orderItem>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
</orderHeader>
<orderHeader>
<distributionChannelCode>10</distributionChannelCode>
<orderItem>
<productCode>AQ7481-002-003</productCode>
</orderItem>
</orderHeader>
我不确定我是否理解了其中的逻辑,但也许下面是按 productCode 对 orderItems 进行分组以确定哪个组具有最多的项目,然后输出尽可能多的 orderHeaders 以及每个组中的相应项目:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="orderHeader">
<xsl:variable name="groups" as="map(xs:string, element(orderItem)*)*">
<xsl:for-each-group select="orderItem" group-by="string(productCode)">
<xsl:map-entry key="current-grouping-key()" select="current-group()"/>
</xsl:for-each-group>
</xsl:variable>
<xsl:variable name="this" select="."/>
<xsl:variable name="max-items" select="max($groups!count(?*))"/>
<xsl:iterate select="1 to $max-items">
<orderHeader>
<xsl:copy-of
select="$this/distributionChannelCode,
$groups ! ?*[current()]"/>
</orderHeader>
</xsl:iterate>
</xsl:template>
</xsl:stylesheet>