如何消除XSLT 1.0中的重复结果?

时间:2015-04-02 16:19:37

标签: xslt-1.0

我正在使用Altova映射工具,我找不到如何消除重复值的选项,所以我试图直接更新XSLT文件,我无法弄清楚如何做到这一点。下面是XSLT文件,问题出在Detail06部分。



<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   <xsl:template match="/">
    <AsyncBarcode>
      <xsl:variable name="var1_instance" select="." />
      <xsl:for-each select="$var1_instance/n:SyncReceiveDelivery">
        <xsl:variable name="var2_SyncReceiveDelivery" select="." />
        <Prefix>
          <xsl:for-each select="n:DataArea/n:Sync/n:AccountingEntityID">
            <CompanyID>
              <xsl:value-of select="string(.)" />
            </CompanyID>
          </xsl:for-each>
          <xsl:for-each select="n:DataArea/n:Sync/n:AccountingEntityID">
            <ExternalPartnerID>
              <xsl:value-of select="string(.)" />
            </ExternalPartnerID>
          </xsl:for-each>
          <DocumentType>
            <xsl:value-of select="'AsyncBarcode'" />
          </DocumentType>
          <xsl:for-each select="n:ApplicationArea/n:BODID">
            <DocumentNumber>
              <xsl:value-of select="substring-after(substring-before(string(.), ':1?'), 'Infor:')" />
            </DocumentNumber>
          </xsl:for-each>
          <TransactionDirection>
            <xsl:value-of select="'I'" />
          </TransactionDirection>
          <DateStamp>
            <xsl:value-of select="substring-before(string(n:ApplicationArea/n:CreationDateTime), 'T')" />
          </DateStamp>
          <TimeStamp>
            <xsl:value-of select="substring-before(substring-after(string(n:ApplicationArea/n:CreationDateTime), 'T'), 'Z')" />
          </TimeStamp>
          <xsl:for-each select="n:ApplicationArea/n:BODID">
            <ControlNumber>
              <xsl:value-of select="substring-after(substring-before(string(.), ':1?'), 'Infor:')" />
            </ControlNumber>
          </xsl:for-each>
        </Prefix>
        <Header00>
          <TransactionDefinitionKey>
            <xsl:value-of select="'25'" />
          </TransactionDefinitionKey>
          <xsl:for-each select="n:DataArea/n:Sync/n:AccountingEntityID">
            <CompanyID0>
              <xsl:value-of select="string(.)" />
            </CompanyID0>
          </xsl:for-each>
          <xsl:for-each select="n:DataArea/n:ReceiveDelivery/n:ReceiveDeliveryHeader/n:DocumentReference/n:DocumentID">
            <xsl:variable name="var14_DocumentID" select="." />
            <xsl:if test="$var14_DocumentID/n:ID/@location">
              <BranchID>
                <xsl:value-of select="substring-before(string(n:ID/@location), '-B')" />
              </BranchID>
            </xsl:if>
          </xsl:for-each>
          <UserID>
            <xsl:value-of select="'WMUser'" />
          </UserID>
          <xsl:for-each select="n:DataArea/n:ReceiveDelivery/n:ReceiveDeliveryHeader/n:WarehouseLocation/n:ID">
            <WarehouseID>
              <xsl:value-of select="substring-before(string(.), '-W')" />
            </WarehouseID>
          </xsl:for-each>
        </Header00>
        <xsl:for-each select="n:DataArea/n:ReceiveDelivery/n:ReceiveDeliveryItem">
          <Detail01>
            <xsl:for-each select="$var2_SyncReceiveDelivery/n:DataArea/n:Sync/n:AccountingEntityID">
              <Scanneddata1>
                <xsl:value-of select="string(.)" />
              </Scanneddata1>
            </xsl:for-each>
          </Detail01>
        </xsl:for-each>
        <xsl:for-each select="n:DataArea/n:ReceiveDelivery">
          <xsl:variable name="var22_ReceiveDelivery" select="." />
          <xsl:for-each select="n:ReceiveDeliveryItem">
            <Detail02>
              <xsl:for-each select="$var22_ReceiveDelivery/n:ReceiveDeliveryHeader/n:DocumentReference/n:DocumentID">
                <xsl:variable name="var26_DocumentID" select="." />
                <xsl:if test="$var26_DocumentID/n:ID/@location">
                  <Scanneddata2>
                    <xsl:value-of select="substring-before(string(n:ID/@location), '-B')" />
                  </Scanneddata2>
                </xsl:if>
              </xsl:for-each>
            </Detail02>
          </xsl:for-each>
        </xsl:for-each>
        <xsl:for-each select="n:DataArea/n:ReceiveDelivery">
          <xsl:variable name="var28_ReceiveDelivery" select="." />
          <xsl:for-each select="n:ReceiveDeliveryItem">
            <Detail03>
              <xsl:for-each select="$var28_ReceiveDelivery/n:ReceiveDeliveryHeader/n:DocumentReference/n:DocumentID">
                <Scanneddata3>
                  <xsl:value-of select="string(n:ID)" />
                </Scanneddata3>
              </xsl:for-each>
            </Detail03>
          </xsl:for-each>
        </xsl:for-each>
        <xsl:for-each select="n:DataArea/n:ReceiveDelivery/n:ReceiveDeliveryItem">
          <Detail04>
            <xsl:for-each select="n:LineNumber">
              <Scanneddata4>
                <xsl:value-of select="string(.)" />
              </Scanneddata4>
            </xsl:for-each>
          </Detail04>
        </xsl:for-each>
        <xsl:for-each select="n:DataArea/n:ReceiveDelivery/n:ReceiveDeliveryItem">
          <xsl:variable name="var38_ReceiveDeliveryItem" select="." />
          <Detail05>
            <xsl:variable name="var40_map_select_SerializedLot">
              <xsl:if test="string((n:SerializedLot/n:Lot/n:LotIDs/n:ID) = (n:SerializedLot/n:Lot/n:LotIDs/n:ID)) != 'false'">
                <xsl:value-of select="'1'" />
              </xsl:if>
            </xsl:variable>
            <xsl:variable name="var48_">
              <xsl:choose>
                <xsl:when test="string(boolean(string($var40_map_select_SerializedLot))) != 'false'">
                  <xsl:variable name="var45_map_select_SerializedLot">
                    <xsl:for-each select="n:SerializedLot/n:Lot/n:LotIDs/n:ID">
                      <xsl:value-of select="string(.)" />
                    </xsl:for-each>
                  </xsl:variable>
                  <xsl:variable name="var41_map_select_SerializedLot">
                    <xsl:if test="string((string($var45_map_select_SerializedLot)) = (string($var45_map_select_SerializedLot))) != 'false'">
                      <xsl:value-of select="'1'" />
                    </xsl:if>
                  </xsl:variable>
                  <xsl:if test="string(boolean(string($var41_map_select_SerializedLot))) != 'false'">
                    <xsl:variable name="var42_map_select_SerializedLot">
                      <xsl:for-each select="n:SerializedLot/n:Lot/n:LotIDs/n:ID">
                        <xsl:value-of select="string(.)" />
                      </xsl:for-each>
                    </xsl:variable>
                    <xsl:value-of select="string($var42_map_select_SerializedLot)" />
                  </xsl:if>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="' '" />
                </xsl:otherwise>
              </xsl:choose>
            </xsl:variable>
            <Scanneddata5>
              <xsl:copy-of select="$var48_" />
            </Scanneddata5>
          </Detail05>
        </xsl:for-each>
        <xsl:for-each select="n:DataArea/n:ReceiveDelivery/n:ReceiveDeliveryItem">
          <Detail06>
            <xsl:for-each select="n:HoldCodes/n:Code">
              <Scanneddata6>
                <xsl:choose>
                  <xsl:when test="string((' ' != string(.))) != 'false'">
                    <xsl:value-of select="'Hold'" />
                  </xsl:when>
                  <xsl:otherwise>
                    <xsl:value-of select="'Inventory'" />
                  </xsl:otherwise>
                </xsl:choose>
              </Scanneddata6>
            </xsl:for-each>
          </Detail06>
        </xsl:for-each>
        <Detail07>
          <xsl:for-each select="n:DataArea/n:ReceiveDelivery/n:ReceiveDeliveryHeader/n:ReceivedDateTime">
            <Scanneddata7>
              <xsl:value-of select="string(.)" />
            </Scanneddata7>
          </xsl:for-each>
        </Detail07>
        <xsl:for-each select="n:DataArea/n:ReceiveDelivery/n:ReceiveDeliveryItem">
          <Detail11>
            <xsl:for-each select="n:ReceivedQuantity">
              <Scanneddata11>
                <xsl:value-of select="number(string(.))" />
              </Scanneddata11>
            </xsl:for-each>
          </Detail11>
        </xsl:for-each>
      </xsl:for-each>
    </AsyncBarcode>
  </xsl:template>
</xsl:stylesheet>
&#13;
&#13;
&#13;

以下是我收到的输入:

&#13;
&#13;
<SyncReceiveDelivery xmlns="http://schema.infor.com/InforOAGIS/2" releaseID="9.2" versionID="2.8.0">
  <ApplicationArea>
    <Sender>
      <LogicalID>lid://</LogicalID>
      <ComponentID>Warehouse Management</ComponentID>
      <ReferenceID accountingEntity="01" location="RS01-W">0000058141</ReferenceID>
    </Sender>
    <CreationDateTime>2015-03-31T20:08:16Z</CreationDateTime>
    <BODID>infor-nid:infor:01:RS01-W:0000002445:62883?ReceiveDelivery&amp;verb=Sync</BODID>
  </ApplicationArea>
  <DataArea>
    <Sync>
      <TenantID>infor</TenantID>
      <AccountingEntityID>01</AccountingEntityID>
      <LocationID accountingEntity="01">RS01-W</LocationID>
      <ActionCriteria>
        <ActionExpression actionCode="Add" />
      </ActionCriteria>
    </Sync>
    <ReceiveDelivery>
      <ReceiveDeliveryHeader>
        <DocumentID>
          <ID accountingEntity="01" location="RS01-W" variationID="62883">0000002445</ID>
        </DocumentID>
        <LastModificationDateTime>2015-03-31T20:08:12Z</LastModificationDateTime>
        <DocumentDateTime>2015-03-31T20:08:12Z</DocumentDateTime>
        <DocumentReference type="CustomerReturn">
          <DocumentID>
            <ID accountingEntity="01" location="1323-B">930131</ID>
          </DocumentID>
        </DocumentReference>
        <Status>
          <Code listID="ReceiveDeliveryStatus">Received</Code>
        </Status>
        <WarehouseLocation>
          <ID accountingEntity="01">RS01-W</ID>
          <Name languageID="en-US">Power Packaging</Name>
          <Address>
            <AddressLine sequence="1">401 N. Main</AddressLine>
            <CityName>Rosendale</CityName>
            <CountrySubDivisionCode>WI</CountrySubDivisionCode>
            <PostalCode listID="PostalCode">54974</PostalCode>
          </Address>
        </WarehouseLocation>
        <ActualDeliveryDateTime>2015-03-31T17:31:46Z</ActualDeliveryDateTime>
        <GrossWeightMeasure unitCode="LB">8120.4147</GrossWeightMeasure>
        <TotalVolumeMeasure unitCode="CF">0</TotalVolumeMeasure>
        <ShipFromParty>
          <Location>
            <ID>30155</ID>
            <Name languageID="en-US">RS-IFP-USFS HOUSTON</Name>
            <Address>
              <AddressLine sequence="1">USFS HOUSTON</AddressLine>
              <AddressLine sequence="2">111 ALIANT DRIVE</AddressLine>
              <CityName>HOUSTON</CityName>
              <CountrySubDivisionCode>TX</CountrySubDivisionCode>
              <CountryCode>USA</CountryCode>
              <PostalCode listID="PostalCode">77032</PostalCode>
            </Address>
          </Location>
        </ShipFromParty>
        <ReceivedDateTime>2015-03-31T20:08:12Z</ReceivedDateTime>
        <DeliverToParty>
          <Location>
            <ID accountingEntity="01">RS01-W</ID>
            <Name languageID="en-US">Power Packaging</Name>
            <Address>
              <AddressLine sequence="1">401 N. Main</AddressLine>
              <CityName>Rosendale</CityName>
              <CountrySubDivisionCode>WI</CountrySubDivisionCode>
              <PostalCode listID="PostalCode">54974</PostalCode>
            </Address>
          </Location>
        </DeliverToParty>
        <ASNReference>
          <DocumentID>
            <ID accountingEntity="01" location="RS01-W">0000002445</ID>
          </DocumentID>
        </ASNReference>
      </ReceiveDeliveryHeader>
      <ReceiveDeliveryItem>
        <ItemID>
          <ID accountingEntity="01">200135-100250</ID>
        </ItemID>
        <ServiceIndicator>false</ServiceIndicator>
        <Description languageID="en-US">Orchard Splash 12/25 fl oz Orange Gold 100</Description>
        <Note languageID="en-US">1</Note>
        <DocumentReference type="CustomerReturn">
          <DocumentID>
            <ID accountingEntity="01" location="1323-B">930131</ID>
          </DocumentID>
          <LineNumber>1</LineNumber>
        </DocumentReference>
        <PackingSlipQuantity unitCode="CS">0.0</PackingSlipQuantity>
        <PackingSlipBaseUOMQuantity unitCode="CS">0.0</PackingSlipBaseUOMQuantity>
        <ReceivedQuantity unitCode="CS">90.0</ReceivedQuantity>
        <ReceivedBaseUOMQuantity unitCode="CS">90.0</ReceivedBaseUOMQuantity>
        <ReturnedQuantity unitCode="CS">0.0</ReturnedQuantity>
        <ReturnedBaseUOMQuantity unitCode="CS">0.0</ReturnedBaseUOMQuantity>
        <SerializedLot>
          <ItemQuantity unitCode="CS">90.0</ItemQuantity>
          <ItemBaseUOMQuantity unitCode="CS">90.0</ItemBaseUOMQuantity>
          <Lot>
            <LotIDs>
              <ID>RS1412107</ID>
            </LotIDs>
            <Quantity unitCode="CS">90.0</Quantity>
            <BaseUOMQuantity unitCode="CS">90.0</BaseUOMQuantity>
          </Lot>
        </SerializedLot>
        <LineNumber>1</LineNumber>
        <HoldCodes>
          <Code listID="Hold Reason Codes">HOLD</Code>
        </HoldCodes>
        <HoldCodes>
          <Code listID="Hold Reason Codes">QCREQ</Code>
        </HoldCodes>
        <CountSequence>1</CountSequence>
      </ReceiveDeliveryItem>
      <ReceiveDeliveryItem>
        <ItemID>
          <ID accountingEntity="01">200135-100252</ID>
        </ItemID>
        <ServiceIndicator>false</ServiceIndicator>
        <Description languageID="en-US">Orchard Hills 12/25 fl oz Orange 100</Description>
        <Note languageID="en-US">2</Note>
        <DocumentReference type="CustomerReturn">
          <DocumentID>
            <ID accountingEntity="01" location="1323-B">930131</ID>
          </DocumentID>
          <LineNumber>2</LineNumber>
        </DocumentReference>
        <PackingSlipQuantity unitCode="CS">0.0</PackingSlipQuantity>
        <PackingSlipBaseUOMQuantity unitCode="CS">0.0</PackingSlipBaseUOMQuantity>
        <ReceivedQuantity unitCode="CS">90.0</ReceivedQuantity>
        <ReceivedBaseUOMQuantity unitCode="CS">90.0</ReceivedBaseUOMQuantity>
        <ReturnedQuantity unitCode="CS">0.0</ReturnedQuantity>
        <ReturnedBaseUOMQuantity unitCode="CS">0.0</ReturnedBaseUOMQuantity>
        <SerializedLot>
          <ItemQuantity unitCode="CS">90.0</ItemQuantity>
          <ItemBaseUOMQuantity unitCode="CS">90.0</ItemBaseUOMQuantity>
          <Lot>
            <LotIDs>
              <ID>RS141112</ID>
            </LotIDs>
            <Quantity unitCode="CS">90.0</Quantity>
            <BaseUOMQuantity unitCode="CS">90.0</BaseUOMQuantity>
          </Lot>
        </SerializedLot>
        <LineNumber>2</LineNumber>
        <HoldCodes>
          <Code listID="Hold Reason Codes">HOLD</Code>
        </HoldCodes>
        <HoldCodes>
          <Code listID="Hold Reason Codes">QCREQ</Code>
        </HoldCodes>
        <CountSequence>1</CountSequence>
      </ReceiveDeliveryItem>
      <ReceiveDeliveryItem>
        <ItemID>
          <ID accountingEntity="01">200135-100252</ID>
        </ItemID>
        <ServiceIndicator>false</ServiceIndicator>
        <Description languageID="en-US">Orchard Hills 12/25 fl oz Orange 100</Description>
        <Note languageID="en-US">3</Note>
        <DocumentReference type="CustomerReturn">
          <DocumentID>
            <ID accountingEntity="01" location="1323-B">930131</ID>
          </DocumentID>
          <LineNumber>3</LineNumber>
        </DocumentReference>
        <PackingSlipQuantity unitCode="CS">0.0</PackingSlipQuantity>
        <PackingSlipBaseUOMQuantity unitCode="CS">0.0</PackingSlipBaseUOMQuantity>
        <ReceivedQuantity unitCode="CS">90.0</ReceivedQuantity>
        <ReceivedBaseUOMQuantity unitCode="CS">90.0</ReceivedBaseUOMQuantity>
        <ReturnedQuantity unitCode="CS">0.0</ReturnedQuantity>
        <ReturnedBaseUOMQuantity unitCode="CS">0.0</ReturnedBaseUOMQuantity>
        <SerializedLot>
          <ItemQuantity unitCode="CS">90.0</ItemQuantity>
          <ItemBaseUOMQuantity unitCode="CS">90.0</ItemBaseUOMQuantity>
          <Lot>
            <LotIDs>
              <ID>RS1412030</ID>
            </LotIDs>
            <Quantity unitCode="CS">90.0</Quantity>
            <BaseUOMQuantity unitCode="CS">90.0</BaseUOMQuantity>
          </Lot>
        </SerializedLot>
        <LineNumber>3</LineNumber>
        <HoldCodes>
          <Code listID="Hold Reason Codes">HOLD</Code>
        </HoldCodes>
        <HoldCodes>
          <Code listID="Hold Reason Codes">QCREQ</Code>
        </HoldCodes>
        <CountSequence>1</CountSequence>
      </ReceiveDeliveryItem>
    </ReceiveDelivery>
  </DataArea>
</SyncReceiveDelivery>
&#13;
&#13;
&#13;

最后,这是我所期待的,但是我在Scannedata6中获取Detail06部分的重复值:

&#13;
&#13;
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE AsyncBarcode SYSTEM "C:/InboundBODS/AsyncBarcode_Inbound.dtd">
<AsyncBarcode>
  <Prefix>
    <CompanyID>01</CompanyID>
    <ExternalPartnerID>01</ExternalPartnerID>
    <DocumentType>AsyncBarcode</DocumentType>
    <DocumentNumber/>
    <TransactionDirection>I</TransactionDirection>
    <DateStamp>2015-03-31</DateStamp>
    <TimeStamp>20:08:16</TimeStamp>
    <ControlNumber/>
  </Prefix>
  <Header00>
    <TransactionDefinitionKey>25</TransactionDefinitionKey>
    <CompanyID0>01</CompanyID0>
    <BranchID>1323</BranchID>
    <UserID>WMUser</UserID>
    <WarehouseID>RS01</WarehouseID>
  </Header00>
  <Detail01>
    <Scanneddata1>01</Scanneddata1>
  </Detail01>
  <Detail01>
    <Scanneddata1>01</Scanneddata1>
  </Detail01>
  <Detail01>
    <Scanneddata1>01</Scanneddata1>
  </Detail01>
  <Detail02>
    <Scanneddata2>1323</Scanneddata2>
  </Detail02>
  <Detail02>
    <Scanneddata2>1323</Scanneddata2>
  </Detail02>
  <Detail02>
    <Scanneddata2>1323</Scanneddata2>
  </Detail02>
  <Detail03>
    <Scanneddata3>930131</Scanneddata3>
  </Detail03>
  <Detail03>
    <Scanneddata3>930131</Scanneddata3>
  </Detail03>
  <Detail03>
    <Scanneddata3>930131</Scanneddata3>
  </Detail03>
  <Detail04>
    <Scanneddata4>1</Scanneddata4>
  </Detail04>
  <Detail04>
    <Scanneddata4>2</Scanneddata4>
  </Detail04>
  <Detail04>
    <Scanneddata4>3</Scanneddata4>
  </Detail04>
  <Detail05>
    <Scanneddata5>RS1412107</Scanneddata5>
  </Detail05>
  <Detail05>
    <Scanneddata5>RS141112</Scanneddata5>
  </Detail05>
  <Detail05>
    <Scanneddata5>RS1412030</Scanneddata5>
  </Detail05>
  <Detail06>
    <Scanneddata6>Hold</Scanneddata6>
  </Detail06>
  <Detail06>
    <Scanneddata6>Hold</Scanneddata6>
  </Detail06>
  <Detail06>
    <Scanneddata6>Hold</Scanneddata6>
  </Detail06>
  <Detail07>
    <Scanneddata7>2015-03-31T20:08:12Z</Scanneddata7>
  </Detail07>
  <Detail11>
    <Scanneddata11>90</Scanneddata11>
  </Detail11>
  <Detail11>
    <Scanneddata11>90</Scanneddata11>
  </Detail11>
  <Detail11>
    <Scanneddata11>90</Scanneddata11>
  </Detail11>
</AsyncBarcode>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

能够弄明白我需要改变什么。更改如下所示:

&#13;
&#13;
<xsl:for-each select="n:DataArea/n:ReceiveDelivery/n:ReceiveDeliveryItem/n:HoldCodes[1]">
  <Detail06>
    <xsl:for-each select="n:Code[1]">
      <Scanneddata6>
        <xsl:choose>
          <xsl:when test="string(('' != string(.))) != 'false'">
            <xsl:value-of select="'Hold'" />
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="'Inventory'" />
          </xsl:otherwise>
        </xsl:choose>
      </Scanneddata6>
    </xsl:for-each>
  </Detail06>
</xsl:for-each>
&#13;
&#13;
&#13;