微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我正在尝试按XSLT中的2个不同元素进行分组首先通过HOSTLOCID,然后通过HOSTVENDORLOCID

如何解决我正在尝试按XSLT中的2个不同元素进行分组首先通过HOSTLOCID,然后通过HOSTVENDORLOCID

下面是我根据该组中其他问题的先前输入创建的XSLT

 <xsl:for-each-group select="/ns0:PurchaSEOrders/ns0:PO" group-by="ns0:HOSTLociD">
        <tns:E1PORDCR1>
        <xsl:for-each-group select="current-group()" group-by="ns0:HOSTvendORLociD">
       
        <tns:E1BPMEPOHEADER>
        
          <tns:COMP_CODE>
            <xsl:value-of select="ns0:HOSTLociD"/>
          </tns:COMP_CODE>
            <xsl:choose>
              <xsl:when test="ns0:ORDERTYPEID = 1">
                <tns:DOC_TYPE>NB</tns:DOC_TYPE>
              </xsl:when>
              <xsl:when test="ns0:ORDERTYPEID = 5">
                <tns:DOC_TYPE>ZNB</tns:DOC_TYPE>
              </xsl:when>
            </xsl:choose>
            
            <xsl:choose>
              <xsl:when test="ns0:ORDERTYPEID = 1">
                <tns:vendOR>
                  <xsl:value-of select="ns0:HOSTvendORLociD"/>
                </tns:vendOR>
              </xsl:when>


              <xsl:when test="ns0:ORDERTYPEID = 5">
                <tns:vendOR>
                  <xsl:value-of select="ns0:HOSTREPLSOURCELociD"/>
                </tns:vendOR>
              </xsl:when>
            </xsl:choose>
          </tns:E1BPMEPOHEADER>
         
        </xsl:for-each-group>
         </tns:E1PORDCR1>
      </xsl:for-each-group>

以下是我要发送的输入

<PurchaSEOrders>
    
    <PO>
        <HOSTLociD>100-0001</HOSTLociD>
        <HOSTPARTID>100</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>
    <PO>
        <HOSTLociD>100-0001</HOSTLociD>
        <HOSTPARTID>200</HOSTPARTID>
        <HOSTvendORLociD>IC200</HOSTvendORLociD>
    </PO>
    <PO>
        <HOSTLociD>100-0001</HOSTLociD>
        <HOSTPARTID>300</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>
    <PO>
        <HOSTLociD>100-0002</HOSTLociD>
        <HOSTPARTID>400</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>    <PO>
        <HOSTLociD>100-0003</HOSTLociD>
        <HOSTPARTID>500</HOSTPARTID>
        <HOSTvendORLociD>IC300</HOSTvendORLociD>
    </PO>
    <PO>
        <HOSTLociD>100-0002</HOSTLociD>
        <HOSTPARTID>600</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>    <PO>
        <HOSTLociD>100-0001</HOSTLociD>
        <HOSTPARTID>700</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>
    <PO>
        <HOSTLociD>100-0003</HOSTLociD>
        <HOSTPARTID>800</HOSTPARTID>
        <HOSTvendORLociD>IC300</HOSTvendORLociD>
    </PO>   
</PurchaSEOrders>

我想作为输出

<PO_Group>
<PurchaSEOrders>
    <!-- Group by Plant-Loc/supplier -->
    <PO>
        <HOSTLociD>100-0001</HOSTLociD>
        <HOSTPARTID>100</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>
    <PO>
        <HOSTLociD>100-0001</HOSTLociD>
        <HOSTPARTID>300</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>
    <PO>
        <HOSTLociD>100-0001</HOSTLociD>
        <HOSTPARTID>700</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>
</PurchaSEOrders>
<PurchaSEOrders>
    <!-- Group by Plant-Loc/supplier -->
    <PO>
        <HOSTLociD>100-0002</HOSTLociD>
        <HOSTPARTID>400</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>   
    <PO>
        <HOSTLociD>100-0002</HOSTLociD>
        <HOSTPARTID>600</HOSTPARTID>
        <HOSTvendORLociD>IC100</HOSTvendORLociD>
    </PO>   
</PurchaSEOrders>
<PurchaSEOrders>
    <!-- Group by Plant-Loc/supplier -->
    <PO>
        <HOSTLociD>100-0003</HOSTLociD>
        <HOSTPARTID>500</HOSTPARTID>
        <HOSTvendORLociD>IC300</HOSTvendORLociD>
    </PO>
    <PO>
        <HOSTLociD>100-0003</HOSTLociD>
        <HOSTPARTID>800</HOSTPARTID>
        <HOSTvendORLociD>IC300</HOSTvendORLociD>
    </PO>   
</PurchaSEOrders>
<PurchaSEOrders >
    <!-- Group by Plant-Loc/supplier -->
    <PO>
        <HOSTLociD>100-0001</HOSTLociD>
        <HOSTPARTID>200</HOSTPARTID>
        <HOSTvendORLociD>IC200</HOSTvendORLociD>
    </PO>
</PurchaSEOrders>
<PO_Group>

我面临的问题是,即使我能够对要素进行分组,所有其他要素也都被覆盖,因此我正在丢失数据。有什么建议吗?

谢谢

解决方法

不清楚为什么要在XSLT中创建未在所需输出中显示的结果元素;也许只需对每个组进行分组,包装和复制就可以了,例如

  <xsl:template match="/">
    <PO_Group>
      <xsl:for-each-group select="PurchaseOrders/PO" composite="yes" group-by="HOSTLOCID,HOSTVENDORLOCID">
        <PurchaseOrders>
          <xsl:apply-templates select="current-group()"/>
        </PurchaseOrders>
      </xsl:for-each-group>
    </PO_Group>
  </xsl:template>

这就是带有composite="yes"的XSLT 3(我认为自Saxon 9.8和Altova XML 2017 R3起受支持),如果您对XSLT 2处理器感到困惑,请使用例如

  <xsl:template match="/">
    <PO_Group>
      <xsl:for-each-group select="PurchaseOrders/PO" group-by="concat(HOSTLOCID,'|',HOSTVENDORLOCID)">
        <PurchaseOrders>
          <xsl:apply-templates select="current-group()"/>
        </PurchaseOrders>
      </xsl:for-each-group>
    </PO_Group>
  </xsl:template>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。