我在对 LuLineItem 进行排序时遇到问题,我需要在其对应的 Iden/IdenValue(其中 IdenType=OCC1 在另一个 LuLineItem 中重复)时对其进行排序,然后基于 Idenvalue(其中 Identype=OCC2)进行排序。
我的 XSLT 未给出正确的顺序。
输入:第一个 LULineItem 中的 IdenValue=1234,其中 identype=OCC1 不重复,但 IdenValue=4567 在第二个和第三个 LULineItem 中重复,因此我们需要根据 IdenValue(其中 IdenType=OCC2)对 LULineItem 进行排序
<SBD>
<SBDH>
<Field1> value1</Field1>
</SBDH>
<rAdvice>
<LULineItem>
<UnitIden>
<CCode>
<SSCC>32101</SSCC>
</CCode>
</UnitIden>
<CLine number="1">
<cIIden>
<ntig>00000000000000</ntig>
<Iden>
<IdenValue>1234</IdenValue>
<IdenType>OCC1</IdenType>
</Iden>
<Iden>
<IdenValue>XYZ</IdenValue>
<IdenType>OCC2</IdenType>
</Iden>
</cIIden>
</CLine>
</LULineItem>
<LULineItem>
<UnitIden>
<CCode>
<SSCC>543857</SSCC>
</CCode>
</UnitIden>
<CLine number="2">
<cIIden>
<ntig>00000000000000</ntig>
<Iden>
<IdenValue>4567</IdenValue>
<IdenType>OCC1</IdenType>
</Iden>
<Iden>
<IdenValue>BCD</IdenValue>
<IdenType>OCC2</IdenType>
</Iden>
</cIIden>
</CLine>
<PO>
<dReference>
<CreatorIden>094832</CreatorIden>
<cOwner>
<nlg>0000000000000</nlg>
</cOwner>
</dReference>
</PO>
</LULineItem>
<LULineItem>
<UnitIden>
<CCode>
<SSCC>32109</SSCC>
</CCode>
</UnitIden>
<CLine number="3">
<cIIden>
<ntig>00000000000000</ntig>
<Iden>
<IdenValue>4567</IdenValue>
<IdenType>OCC1</IdenType>
</Iden>
<Iden>
<IdenValue>3109</IdenValue>
<IdenType>OCC3</IdenType>
</Iden>
<Iden>
<IdenValue>ACD</IdenValue>
<IdenType>OCC2</IdenType>
</Iden>
</cIIden>
</CLine>
</LULineItem>
</rAdvice>
</SBD>
所需输出:
<SBD>
<SBDH>
<Field1> value1</Field1>
</SBDH>
<rAdvice>
<LULineItem>
<UnitIden>
<CCode>
<SSCC>32101</SSCC>
</CCode>
</UnitIden>
<CLine number="1">
<cIIden>
<ntig>00000000000000</ntig>
<Iden>
<IdenValue>1234</IdenValue>
<IdenType>OCC1</IdenType>
</Iden>
<Iden>
<IdenValue>XYZ</IdenValue>
<IdenType>OCC2</IdenType>
</Iden>
</cIIden>
</CLine>
</LULineItem>
<LULineItem>
<UnitIden>
<CCode>
<SSCC>32109</SSCC>
</CCode>
</UnitIden>
<CLine number="3">
<cIIden>
<ntig>00000000000000</ntig>
<Iden>
<IdenValue>4567</IdenValue>
<IdenType>OCC1</IdenType>
</Iden>
<Iden>
<IdenValue>3109</IdenValue>
<IdenType>OCC3</IdenType>
</Iden>
<Iden>
<IdenValue>ACD</IdenValue>
<IdenType>OCC2</IdenType>
</Iden>
</cIIden>
</CLine>
</LULineItem>
<LULineItem>
<UnitIden>
<CCode>
<SSCC>543857</SSCC>
</CCode>
</UnitIden>
<CLine number="2">
<cIIden>
<ntig>00000000000000</ntig>
<Iden>
<IdenValue>4567</IdenValue>
<IdenType>OCC1</IdenType>
</Iden>
<Iden>
<IdenValue>BCD</IdenValue>
<IdenType>OCC2</IdenType>
</Iden>
</cIIden>
</CLine>
<PO>
<dReference>
<CreatorIden>094832</CreatorIden>
<cOwner>
<nlg>0000000000000</nlg>
</cOwner>
</dReference>
</PO>
</LULineItem>
</rAdvice>
</SBD>
我使用的XSLT如下:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:output method="xml" indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="LULineItem">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each-group select="CLine" group-by="Iden[IdenType='OCC1']/IdenValue">
<xsl:apply-templates select="current-group()">
<xsl:sort select="Iden[IdenType='OCC2']/IdenValue"/>
</xsl:apply-templates>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请审核一次
分组键和排序键看起来都是错误的,因为
CLine
元素没有 Iden
作为直接子元素。我没有看过确切的逻辑,但也许(在这两种情况下)Iden
应该是cIIden/Iden
。
但这也感觉不对。从
LULineItem
中,您选择 CLine
子项并将它们分组,但只有一个 CLine
子项,因此分组没有任何效果。
据我所知,您的输入包含三个
LULineItem
元素,您的输出包含相同的三个 LULineItem
元素,但顺序不同。因此,对 LULineItem
元素的处理应该只是将其原样复制到输出。订单的控制需要由上层进行。我期待类似的事情
<xsl:template match="rAdvice">
<xsl:for-each select="LULineItem">
<xsl:sort select="...."/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:template>
但我无法从你的描述中找出排序键应该是什么。
抱歉,如果我错过了什么。