如何解决我正在尝试按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 举报,一经查实,本站将立刻删除。