【问题标题】:how to process xml tags with same name in xslt如何在xslt中处理同名的xml标签
【发布时间】:2021-07-08 08:40:42
【问题描述】:

几年前,我在您的帮助下创建了一个发送和收取发票的程序。然后瑞士邮政改用二维码,在您的帮助下,我现在可以发送带有二维码的发票。它们使用与以前相同的 xml 程序兑现,但在已用于拒绝代码的同一标签中还有其他信息,我无法在 xmlt 中处理它。 使用的标签是 Document /BkToCstmrDbtCdtNtfctn/Ntfctn/Ntry/NtryDtls/RmtInf/Strd/AddtlRmtInf

这是我收到的没有二维码的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04 camt.054.001.04.xsd">
 <BkToCstmrDbtCdtNtfctn>
   <GrpHdr>...</GrpHdr>
   <Ntfctn>
     ...
     <Ntry>
       <NtryRef>010993990</NtryRef>
       <Amt Ccy="CHF">9069.65</Amt>
       <CdtDbtInd>CRDT</CdtDbtInd>
       ...
       <Chrgs>
         <TtlChrgsAndTaxAmt Ccy="CHF">7.00</TtlChrgsAndTaxAmt>
         ...
       </Chrgs>
       <NtryDtls>
         <Btch>
           <NbOfTxs>12</NbOfTxs>
         </Btch>
         <TxDtls>
          ...
          <Amt Ccy="CHF">530.75</Amt>
          <CdtDbtInd>CRDT</CdtDbtInd>
          ...
          <RmtInf>
            <Strd>
              <CdtrRefInf>
                 ...
                 <Ref>329501419000000000000791737</Ref>
              </CdtrRefInf>
              <AddtlRmtInf>?REJECT?0</AddtlRmtInf>
            </Strd>
          </RmtInf>
          <RltdDts>
            <AccptncDtTm>2019-07-02T20:00:00</AccptncDtTm>
          </RltdDts>
        </TxDtls>
        <TxDtls>...</TxDtls>
         ...
      </NtryDtls>
      <AddtlNtryInf>CRÉDIT GROUPÉ BVR TRAITEMENT DU 02.07.2019 </AddtlNtryInf>
  </Ntry>
</Ntfctn>

以及使用的 xmlt:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ld="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04"
  exclude-result-prefixes="ld">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="ld:Document">
    <xsl:copy>
        <xsl:for-each select="ld:BkToCstmrDbtCdtNtfctn/ld:Ntfctn/ld:Ntry">
            <xsl:for-each select="ld:NtryDtls">
                <xsl:for-each select="ld:TxDtls">
                    <xsl:element name="Paiement">
                        <xsl:element name="MsgId">
                            <xsl:value-of select="../../../../ld:GrpHdr/ld:MsgId"/>
                        </xsl:element>
                        <xsl:element name="MsgDate">
                            <xsl:value-of select="../../../../ld:GrpHdr/ld:CreDtTm"/>
                        </xsl:element>
                        <xsl:element name="MsgPageNb">
                            <xsl:value-of select="../../../../ld:GrpHdr/ld:MsgPgntn/ld:PgNb"/>
                        </xsl:element>
                        <xsl:element name="MsgLastPage">
                            <xsl:value-of select="../../../../ld:GrpHdr/ld:MsgPgntn/ld:LastPgInd"/>
                        </xsl:element>
                        <xsl:element name="MsgType">
                            <xsl:value-of select="../../../ld:CpyDplctInd"/>
                        </xsl:element>
                        <xsl:element name="MsgOrigine">
                            <xsl:value-of select="../../../ld:RptgSrc/ld:Prtry"/>
                        </xsl:element>
                        <xsl:element name="ValableDepuis">
                            <xsl:value-of select="../../../ld:FrToDt/ld:FrDtTm"/>
                        </xsl:element>
                        <xsl:element name="ValableJusque">
                            <xsl:value-of select="../../../ld:FrToDt/ld:ToDtTm"/>
                        </xsl:element>
                        <xsl:element name="IbanCpteCredit">
                            <xsl:value-of select="../../../ld:Acct/ld:Id/ld:IBAN"/>
                        </xsl:element>
                        <xsl:element name="OwnerCpteCredit">
                            <xsl:value-of select="../../../ld:Acct/ld:Ownr/ld:Nm"/>
                        </xsl:element>
                        <xsl:element name="ParticipantBVR">
                            <xsl:value-of select="../../ld:NtryRef"/>
                        </xsl:element>
                        <xsl:element name="MontantTotalGrPts">
                            <xsl:value-of select="../../ld:Amt"/>
                        </xsl:element>
                        <xsl:element name="TypeEcritureGrPts">
                            <xsl:value-of select="../../ld:CdtDbtInd"/>
                        </xsl:element>
                        <xsl:element name="EtatEcritureGrPts">
                            <xsl:value-of select="../../ld:Sts"/>
                        </xsl:element>
                        <xsl:element name="EcritureInverseeGrPts">
                            <xsl:value-of select="../../ld:RvslInd"/>
                        </xsl:element>
                        <xsl:element name="DateEcritureGrPts">
                            <xsl:value-of select="../../ld:BookgDt/ld:Dt"/>
                        </xsl:element>
                        <xsl:element name="DateValeurGrPts">
                            <xsl:value-of select="../../ld:ValDt/ld:Dt"/>
                        </xsl:element>
                        <xsl:element name="RefEcritureGrPts">
                            <xsl:value-of select="../../ld:AcctSvcrRef"/>
                        </xsl:element>
                        <xsl:element name="BTCDomainGrPts">
                            <xsl:value-of select="../../ld:BkTxCd/ld:Domn/ld:Cd"/>
                        </xsl:element>
                        <xsl:element name="BTCFamilyGrPts">
                            <xsl:value-of select="../../ld:BkTxCd/ld:Domn/ld:Fmly/ld:Cd"/>
                        </xsl:element>
                        <xsl:element name="BTCSubFamilyGrPts">
                            <xsl:value-of select="../../ld:BkTxCd/ld:Domn/ld:Fmly/ld:SubFmlyCd"/>
                        </xsl:element>
                        <xsl:element name="TaxesTtlesGrPts">
                            <xsl:value-of select="../../ld:Chrgs/ld:TtlChrgsAndTaxAmt"/>
                        </xsl:element>
                        <xsl:element name="InfoGrPts">
                            <xsl:value-of select="../../ld:AddtlNtryInf"/>
                        </xsl:element>
                        <xsl:element name="PaiementId">
                            <xsl:value-of select="ld:Refs/ld:AcctSvcrRef"/>
                        </xsl:element>
                        <xsl:element name="Reference">
                            <xsl:value-of select="ld:RmtInf/ld:Strd/ld:CdtrRefInf/ld:Ref"/>
                        </xsl:element>
                        <xsl:element name="MontantCcy">
                            <xsl:value-of select="ld:Amt/@Ccy"/>
                        </xsl:element>          
                        <xsl:element name="Montant">
                            <xsl:value-of select="ld:Amt"/>
                        </xsl:element>
                        <xsl:element name="MontantCrediteCcy">
                            <xsl:value-of select="ld:AmtDtls/ld:TxAmt/ld:Amt/@Ccy"/>
                        </xsl:element>          
                        <xsl:element name="MontantCredite">
                            <xsl:value-of select="ld:AmtDtls/ld:TxAmt/ld:Amt"/>
                        </xsl:element>
                        <xsl:element name="TaxeBV">
                            <xsl:value-of select="ld:Chrgs/ld:TtlChrgsAndTaxAmt"/>
                        </xsl:element>
                        <xsl:element name="NomDebiteur">
                            <xsl:value-of select="ld:RltdPties/ld:Dbtr/ld:Nm"/>
                        </xsl:element>          
                        <xsl:element name="VilleDebiteur">
                            <xsl:value-of select="ld:RltdPties/ld:Dbtr/ld:PstlAdr/ld:TwnNm"/>
                        </xsl:element>          
                        <xsl:element name="AdresseDebiteur">
                            <xsl:value-of select="ld:RltdPties/ld:Dbtr/ld:PstlAdr/ld:AdrLine"/>
                        </xsl:element>          
                        <xsl:element name="codeRejet">
                            <xsl:value-of select="ld:RmtInf/ld:Strd/ld:AddtlRmtInf"/>
                        </xsl:element>
                    </xsl:element>
                </xsl:for-each>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

样式表>

这是我收到的带有二维码的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04 camt.054.001.04.xsd">
<BkToCstmrDbtCdtNtfctn>
    <GrpHdr>...</GrpHdr>
    <Ntfctn>
       ...
       <Ntry>
          <NtryRef>CH7830000001145978107</NtryRef>
          <Amt Ccy="CHF">1.10</Amt>
          <CdtDbtInd>CRDT</CdtDbtInd>
          ...
          <NtryDtls>
          <Btch><NbOfTxs>1</NbOfTxs></Btch>
          <TxDtls>
              <Refs>...</Refs>
              <Amt Ccy="CHF">1.10</Amt>
              <CdtDbtInd>CRDT</CdtDbtInd>
              ...
              <RltdPties>
                 <Dbtr>...</Dbtr>
                 <DbtrAcct><Id><IBAN>CH30</IBAN></Id></DbtrAcct>
                 <UltmtDbtr>...</UltmtDbtr>
              </RltdPties>
              <RltdAgts><DbtrAgt><Nm>POSTFINANCE AG</Nm></DbtrAgt></RltdAgts>
              <RmtInf>
                 <Strd>
                    <CdtrRefInf>
                        <Tp><CdOrPrtry><Prtry>QRR</Prtry></CdOrPrtry></Tp> 
                        <Ref>329501419000000000050003414</Ref>
                     </CdtrRefInf>
                     <AddtlRmtInf>?REJECT?0</AddtlRmtInf>
                     <AddtlRmtInf>?ERROR?000</AddtlRmtInf>
                     <AddtlRmtInf>facture no 5000341 envoyée le 14.06 .2021 -</AddtlRmtInf>
                  </Strd>
              </RmtInf>
           <RltdDts><AccptncDtTm>2021-06-15T20:00:00</AccptncDtTm></RltdDts>
        </TxDtls>
     </NtryDtls>
     <AddtlNtryInf>CRÉDIT GROUPÉ POUR COMPTE: CH78</AddtlNtryInf>
   </Ntry>
</Ntfctn>

我需要“2021 年 6 月 14 日发送的 5000341 号发票”信息。我尝试使用“for each”循环,但第一行(拒绝代码)显示了 3 次。

你能帮帮我吗?

感谢您的留言。 这是预期的结果:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Paiement xmlns="">
  <MsgId>20210615375204613904176</MsgId>
  <MsgDate>2021-06-15T23:37:21</MsgDate>
  <MsgPageNb>1</MsgPageNb>
  <MsgLastPage>true</MsgLastPage>
  <MsgType/>
  <MsgOrigine>OTHR</MsgOrigine>
  <ValableDepuis>2021-06-15T00:00:00</ValableDepuis>
  <ValableJusque>2021-06-15T23:59:59</ValableJusque>
  <IbanCpteCredit>CH3009000000145978107</IbanCpteCredit>
  <OwnerCpteCredit>Fiduciaire Factoring Yenni Sàrl 
     Etagnières</OwnerCpteCredit>
  <ParticipantBVR>CH7830000001145978107</ParticipantBVR>
  <MontantTotalGrPts>1.10</MontantTotalGrPts>
  <TypeEcritureGrPts>CRDT</TypeEcritureGrPts>
  <EtatEcritureGrPts>BOOK</EtatEcritureGrPts>
  <EcritureInverseeGrPts>false</EcritureInverseeGrPts>
  <DateEcritureGrPts>2021-06-15</DateEcritureGrPts>
  <DateValeurGrPts>2021-06-15</DateValeurGrPts>
  <RefEcritureGrPts>1661200078041B6U</RefEcritureGrPts>
  <BTCDomainGrPts>PMNT</BTCDomainGrPts>
  <BTCFamilyGrPts>RCDT</BTCFamilyGrPts>
  <BTCSubFamilyGrPts>VCOM</BTCSubFamilyGrPts>
  <TaxesTtlesGrPts/>
  <InfoGrPts>CRÉDIT GROUPÉ POUR COMPTE: CH7830000001145978107 
    TRAITEMENT DU 15.06.2021  PAQUET ID: 210615CH00000F3I</InfoGrPts>
  <PaiementId>210614CH077N887Z</PaiementId>
  <Reference>329501419000000000050003414</Reference>
  <MontantCcy>CHF</MontantCcy>
  <Montant>1.10</Montant>
  <MontantCrediteCcy/>
  <MontantCredite/>
  <TaxeBV/>
  <NomDebiteur>Fiduciaire Factoring  Yenni</NomDebiteur>
  <VilleDebiteur>Etagnières</VilleDebiteur>
  <AdresseDebiteur/>
  <codeRejet>?REJECT?0</codeReject>
  <codeErreur>?ERROR?000</codeErreur>
  <factureInfo>facture no 5000341 envoyée le 14.06 .2021 - </factureInfo>

我使用这个结果来填充一个 MS 访问表

【问题讨论】:

  • 请编辑您的问题并添加您期望得到的确切结果。
  • 你好迈克尔,我添加了我期望得到的结果。

标签: xml xslt


【解决方案1】:

我需要“2021 年 6 月 14 日发送的 5000341 号发票”信息。我尝试使用“for each”循环,但第一行(拒绝代码)显示了 3 次。

考虑这个简化的示例:

XML

<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04 camt.054.001.04.xsd">
    <BkToCstmrDbtCdtNtfctn>
        <GrpHdr>...</GrpHdr>
        <Ntfctn>
            <Ntry>
                <NtryRef>CH7830000001145978107</NtryRef>
                <Amt Ccy="CHF">1.10</Amt>
                <CdtDbtInd>CRDT</CdtDbtInd>
                <NtryDtls>
                    <Btch>
                        <NbOfTxs>1</NbOfTxs>
                    </Btch>
                    <TxDtls>
                        <Refs>...</Refs>
                        <Amt Ccy="CHF">1.10</Amt>
                        <CdtDbtInd>CRDT</CdtDbtInd>
                        <RltdPties>
                            <Dbtr>...</Dbtr>
                            <DbtrAcct>
                                <Id>
                                    <IBAN>CH30</IBAN>
                                </Id>
                            </DbtrAcct>
                            <UltmtDbtr>...</UltmtDbtr>
                        </RltdPties>
                        <RltdAgts>
                            <DbtrAgt>
                                <Nm>POSTFINANCE AG</Nm>
                            </DbtrAgt>
                        </RltdAgts>
                        <RmtInf>
                            <Strd>
                                <CdtrRefInf>
                                    <Tp>
                                        <CdOrPrtry>
                                            <Prtry>QRR</Prtry>
                                        </CdOrPrtry>
                                    </Tp>
                                    <Ref>329501419000000000050003414</Ref>
                                </CdtrRefInf>
                                <AddtlRmtInf>?REJECT?0</AddtlRmtInf>
                                <AddtlRmtInf>?ERROR?000</AddtlRmtInf>
                                <AddtlRmtInf>facture no 5000341 envoyée le 14.06 .2021 -</AddtlRmtInf>
                            </Strd>
                        </RmtInf>
                        <RltdDts>
                            <AccptncDtTm>2021-06-15T20:00:00</AccptncDtTm>
                        </RltdDts>
                    </TxDtls>
                </NtryDtls>
                <AddtlNtryInf>CRÉDIT GROUPÉ POUR COMPTE: CH78</AddtlNtryInf>
            </Ntry>
        </Ntfctn>
    </BkToCstmrDbtCdtNtfctn>
</Document>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ld="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04"
exclude-result-prefixes="ld">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/ld:Document">
    <xsl:copy>
        <xsl:for-each select="ld:BkToCstmrDbtCdtNtfctn/ld:Ntfctn/ld:Ntry/ld:NtryDtls/ld:TxDtls">
            <Paiement>
                <!-- ... -->
                <codeRejet>
                    <xsl:value-of select="ld:RmtInf/ld:Strd/ld:AddtlRmtInf[1]"/>
                </codeRejet>
                <codeErreur>
                    <xsl:value-of select="ld:RmtInf/ld:Strd/ld:AddtlRmtInf[2]"/>
                </codeErreur>
                <factureInfo>
                    <xsl:value-of select="ld:RmtInf/ld:Strd/ld:AddtlRmtInf[3]"/>
                </factureInfo>
            </Paiement>
        </xsl:for-each> 
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.04" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Paiement xmlns="">
    <codeRejet>?REJECT?0</codeRejet>
    <codeErreur>?ERROR?000</codeErreur>
    <factureInfo>facture no 5000341 envoyée le 14.06 .2021 -</factureInfo>
  </Paiement>
</Document>

这是基于这样的假设:重复的AddtlRmtInf 元素将始终以相同的顺序出现,具有相同的含义。如果这不是一个有效的假设,那么我们需要解释输入 XML 的构造逻辑。


注意,当元素名称已知时,不必使用xsl:element;只需使用literal result element


附:您可能更喜欢替换:

                <codeRejet>
                    <xsl:value-of select="ld:RmtInf/ld:Strd/ld:AddtlRmtInf[1]"/>
                </codeRejet>
                <codeErreur>
                    <xsl:value-of select="ld:RmtInf/ld:Strd/ld:AddtlRmtInf[2]"/>
                </codeErreur>
                <factureInfo>
                    <xsl:value-of select="ld:RmtInf/ld:Strd/ld:AddtlRmtInf[3]"/>
                </factureInfo>
            

更高效:

                <xsl:variable name="addtlRmtInf" select="ld:RmtInf/ld:Strd/ld:AddtlRmtInf" />
                <codeRejet>
                    <xsl:value-of select="$addtlRmtInf[1]"/>
                </codeRejet>
                <codeErreur>
                    <xsl:value-of select="$addtlRmtInf[2]"/>
                </codeErreur>
                <factureInfo>
                    <xsl:value-of select="$addtlRmtInf[3]"/>
                </factureInfo>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2023-02-15
    相关资源
    最近更新 更多