XSLT:使用关键字段时的排序问题

问题描述 投票:0回答:1

我在对 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:template match="rAdvice">
      <xsl:for-each select="LULineItem">
           <xsl:sort select="CIIden/Iden[IdenType='OCC2']/IdenValue" data-type="text" order="ascending"/>
        <xsl:copy-of select="."/>
      </xsl:for-each>
   
  </xsl:template> 

</xsl:stylesheet>

请审核一次

xslt xslt-2.0 xslt-3.0
1个回答
1
投票

分组键和排序键看起来都是错误的,因为

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>

但我无法从你的描述中找出排序键应该是什么。

抱歉,如果我错过了什么。

© www.soinside.com 2019 - 2024. All rights reserved.