首页 > 解决方案 > 为 XML 中的 CASH_RECEIPT_LINE_NO 标记创建增量编号

问题描述

以下是正确的 XML 文件转换后的最终输出。我需要找到一种机制来以编程方式为 CASH_RECEIPT_LINE_NO 标签创建一个唯一的增量编号(例如 1、2、3 ......)

<CASH_RECEIPT_LOG xmlns:xsi="urn:ifsworld-com:schemas:receive_cash_receipt_pos"
                  xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <MSG_CONTRACT>0</MSG_CONTRACT>
   <MSG_DATE>2019-05-07+02:00 15:13:14.636+02:00</MSG_DATE>
   <CASH_RECEIPTS>
      <CASH_RECEIPT>
         <EMPLOYEE_ID>ADMIN</EMPLOYEE_ID>
         <LINES>
            <CASH_RECEIPT_LINE>
               <CASH_RECEIPT_LINE_NO>1</CASH_RECEIPT_LINE_NO>
               <INTERNAL_TRANSACTION_CODE>INVPARTSALE</INTERNAL_TRANSACTION_CODE>
            </CASH_RECEIPT_LINE>
            <CASH_RECEIPT_LINE>
               <CASH_RECEIPT_LINE_NO>1</CASH_RECEIPT_LINE_NO>
               <INTERNAL_TRANSACTION_CODE>VAT</INTERNAL_TRANSACTION_CODE>
            </CASH_RECEIPT_LINE>
         </LINES>
      </CASH_RECEIPT>
   </CASH_RECEIPTS>
</CASH_RECEIPT_LOG>

下面是我的 XSL 转换器

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns3="http://NEXSTEP.Schemas.Bonger" xmlns:ns2="http://NEXSTEP.Schemas.NexstepTypes" exclude-result-prefixes="ns2 ns3">
    <xsl:template match="*">
        <xsl:element name="{name()}" namespace="{namespace-uri()}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="/ns3:Bonger">
        <CASH_RECEIPT_LOG xmlns:xsi="urn:ifsworld-com:schemas:receive_cash_receipt_pos" xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <MSG_CONTRACT>
                <xsl:value-of select="MESSAGE_RECORD/InsertChange/Avdeling"/>
            </MSG_CONTRACT>
            <MSG_DATE>
                <xsl:value-of select="concat(MESSAGE_RECORD/InsertChange/Message/ns2:OpprettetEndretSlettet/ns2:OpprettetTidspunkt, ' ',MESSAGE_RECORD/InsertChange/Message/ns2:OpprettetEndretSlettet/ns2:OpprettetKl )"/>
            </MSG_DATE>
            <CASH_RECEIPTS>
                <CASH_RECEIPT>
                    <EMPLOYEE_ID>
                        <xsl:value-of select="MESSAGE_RECORD/InsertChange/Brukernavn"/>
                    </EMPLOYEE_ID>
                    <LINES>
                        <xsl:for-each select="MESSAGE_RECORD/InsertChange">
                            <xsl:if test="Bonglinjer/Bonglinje/sumDiscountedPrice/ns2:BelopFelt[string-length() > 0]">
                                <CASH_RECEIPT_LINE>
                                    <CASH_RECEIPT_LINE_NO>1</CASH_RECEIPT_LINE_NO>                                       
                                         <INTERNAL_TRANSACTION_CODE>INVPARTSALE</INTERNAL_TRANSACTION_CODE>
                                </CASH_RECEIPT_LINE>
                            </xsl:if>
                            <xsl:if test="Bonglinjer/Bonglinje/mvaKode[string-length() > 0]">
                                <CASH_RECEIPT_LINE>
                                    <CASH_RECEIPT_LINE_NO>1</CASH_RECEIPT_LINE_NO>
                                    <INTERNAL_TRANSACTION_CODE>VAT</INTERNAL_TRANSACTION_CODE>
                                    
                                </CASH_RECEIPT_LINE>
                            </xsl:if>
                        </xsl:for-each>
                    </LINES>
                </CASH_RECEIPT>
            </CASH_RECEIPTS>
        </CASH_RECEIPT_LOG>
    </xsl:template>
</xsl:stylesheet>

任何帮助都非常感谢。

============= 已编辑 ========================

<?xml version="1.0" encoding="UTF-8"?>
<ns3:Bonger xmlns:ns3="http://NEXSTEP.Schemas.Bonger" xmlns:ns2="http://NEXSTEP.Schemas.NexstepTypes">
  <ROUTE_RECORD>
    <ns2:SENDER Sender_code="BO_SERVER"/>
    <ns2:RECEIPIENT Receipient_code="MASTER"/>
    <ns2:MESSAGE_ID Type_name="Bonger" Version_number="1.0"/>
    <ns2:DATE Date_of_preparation="2019-05-07+02:00" Time_of_preparation="15:14:24"/>
    <ns2:OverAllStatus>NY</ns2:OverAllStatus>
  </ROUTE_RECORD>
  <MESSAGE_RECORD>
    <InsertChange>
      <Message>
        <ns2:OpprettetEndretSlettet>
          <ns2:OpprettetTidspunkt>2019-05-07+02:00</ns2:OpprettetTidspunkt>
          <ns2:OpprettetKl>15:13:14.636+02:00</ns2:OpprettetKl>
          <ns2:EndretTidspunkt>2019-05-07+02:00</ns2:EndretTidspunkt>
          <ns2:EndretKl>15:14:15.492+02:00</ns2:EndretKl>
          <ns2:EndretAv>ADMIN</ns2:EndretAv>
        </ns2:OpprettetEndretSlettet>
      </Message>
      <DokumentType>B</DokumentType>
      <DokumentNr>B01-110</DokumentNr>
      <Avdeling>0</Avdeling>
      <KundeNr>0</KundeNr>
      <Bonglinjer>
        <Bonglinje xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:Varelinje">
          <salesPrice>
            <ns2:BelopFelt>77.0</ns2:BelopFelt>
            <ns2:Valutakode>NOK</ns2:Valutakode>
          </salesPrice>
          <salesPriceExVat>
            <ns2:BelopFelt>61.600</ns2:BelopFelt>
            <ns2:Valutakode>NOK</ns2:Valutakode>
          </salesPriceExVat>
          <discountedPrice>
            <ns2:BelopFelt>77.0</ns2:BelopFelt>
            <ns2:Valutakode>NOK</ns2:Valutakode>
          </discountedPrice>
          <discountedPriceExVat>
            <ns2:BelopFelt>61.60</ns2:BelopFelt>
            <ns2:Valutakode>NOK</ns2:Valutakode>
          </discountedPriceExVat>
          <sumSalesPrice>
            <ns2:BelopFelt>1540.0</ns2:BelopFelt>
            <ns2:Valutakode>NOK</ns2:Valutakode>
          </sumSalesPrice>
          <sumSalesPriceExVat>
            <ns2:BelopFelt>1232.00</ns2:BelopFelt>
            <ns2:Valutakode>NOK</ns2:Valutakode>
          </sumSalesPriceExVat>
          <sumDiscountedPrice>
            <ns2:BelopFelt>1540.0</ns2:BelopFelt>
            <ns2:Valutakode>NOK</ns2:Valutakode>
          </sumDiscountedPrice>
          <sumDiscountedPriceExVat>
            <ns2:BelopFelt>1232.0</ns2:BelopFelt>
            <ns2:Valutakode>NOK</ns2:Valutakode>
          </sumDiscountedPriceExVat>
          <mvaKode>VHØY</mvaKode>
          <mvaSats>25.00</mvaSats>
        </Bonglinje>
      </Bonglinjer>
      <totalSum>
        <ns2:BelopFelt>1232.00</ns2:BelopFelt>
        <ns2:Valutakode>NOK</ns2:Valutakode>
      </totalSum>
      <totalDiscountedSum>
        <ns2:BelopFelt>1232.00</ns2:BelopFelt>
        <ns2:Valutakode>NOK</ns2:Valutakode>
      </totalDiscountedSum>
      <BetaltCash>
        <ns2:BelopFelt>1000</ns2:BelopFelt>
        <ns2:Valutakode>NOK</ns2:Valutakode>
      </BetaltCash>
      <BetaltCard>
        <ns2:BelopFelt>700</ns2:BelopFelt>
        <ns2:Valutakode>NOK</ns2:Valutakode>
      </BetaltCard>
      <MoneyBack>
        <ns2:BelopFelt>160</ns2:BelopFelt>
        <ns2:Valutakode>NOK</ns2:Valutakode>
      </MoneyBack>
      <RoundingAmount>
        <ns2:BelopFelt>0.0</ns2:BelopFelt>
        <ns2:Valutakode>NOK</ns2:Valutakode>
      </RoundingAmount>
    </InsertChange>
  </MESSAGE_RECORD>
</ns3:Bonger>

以上是示例 XML 输入

标签: xmlxslt-1.0

解决方案


如果编号序列中不能有任何间隙,则必须分两遍执行此操作:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns3="http://NEXSTEP.Schemas.Bonger" xmlns:ns2="http://NEXSTEP.Schemas.NexstepTypes" 
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl ns2 ns3">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/ns3:Bonger">
    <CASH_RECEIPT_LOG>
        <!-- skipped -->
        <CASH_RECEIPTS>
            <CASH_RECEIPT>
                <!-- skipped -->
                <LINES>
                    <xsl:variable name="codes">
                        <xsl:for-each select="MESSAGE_RECORD/InsertChange">
                            <xsl:if test="Bonglinjer/Bonglinje/sumDiscountedPrice/ns2:BelopFelt/text()">
                                <INTERNAL_TRANSACTION_CODE>INVPARTSALE</INTERNAL_TRANSACTION_CODE>
                            </xsl:if>
                            <xsl:if test="Bonglinjer/Bonglinje/mvaKode/text()">
                                <INTERNAL_TRANSACTION_CODE>VAT</INTERNAL_TRANSACTION_CODE>
                            </xsl:if>
                        </xsl:for-each> 
                    </xsl:variable>
                    <xsl:for-each select="exsl:node-set($codes)/INTERNAL_TRANSACTION_CODE">
                        <CASH_RECEIPT_LINE>
                            <CASH_RECEIPT_LINE_NO>
                                <xsl:value-of select="position()"/>
                            </CASH_RECEIPT_LINE_NO>
                            <xsl:copy-of select="."/>
                        </CASH_RECEIPT_LINE>
                    </xsl:for-each>
                </LINES>
            </CASH_RECEIPT>
        </CASH_RECEIPTS>
    </CASH_RECEIPT_LOG>
</xsl:template>

</xsl:stylesheet>

推荐阅读