为 XML 中的 CASH_RECEIPT_LINE_NO 标签创建一个递增数字
Create an incremental number for CASH_RECEIPT_LINE_NO tag in XML
下面是我转换 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输入
如果您不能在编号序列中有任何间隙,那么您将不得不分两次执行此操作:
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>
下面是我转换 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输入
如果您不能在编号序列中有任何间隙,那么您将不得不分两次执行此操作:
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>