【问题标题】:duplicate consideration from source through xslt通过 xslt 从源头重复考虑
【发布时间】:2021-06-21 23:09:25
【问题描述】:

输入数据:以下是从源获取的输入数据。我们如何通过 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>

【问题讨论】:

    标签: xslt xslt-1.0 xslt-2.0 xslt-grouping


    【解决方案1】:

    我不确定我是否理解了其中的逻辑,但可能以下内容按 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 2.0 中提供相同的代码——因为我熟悉 2.0 版并且我对 3.0 版非常陌生。非常感谢我
    • 嗯,有文档和培训材料,如altova.com/training/xpath3/xpath-31#mapsw3.org/TR/xslt-30/#iteratew3.org/TR/xpath-31/#id-maps。我没有使用 XSLT 3 的特性来使事情复杂化,如果您可以将组存储在一系列地图中并进一步处理,问题会更容易。
    • 我从上周开始尝试这个逻辑,你终于做到了。非常感谢您的快速回复..
    • 你好马丁,如果值像 A123-100-200 一样,上面的代码不起作用。你能回复一下吗。我们如何实现这一目标
    • @srikanthboda,用最少但完整的输入样本、想要的结果、您尝试过的代码以及得到的错误结果提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2019-08-26
    相关资源
    最近更新 更多