如何在xslt中使用来自前缀命名空间的类型

时间:2017-03-25 10:08:57

标签: xml xslt namespaces

经过大量的研究和大量测试后,我开始转换我的xml文件。

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.six-interbank-clearing.com/de/pain.001.001.03.ch.02.xsd" xsi:schemaLocation="http://www.six-interbank-clearing.com/de/pain.001.001.03.ch.02.xsd pain.001.001.03.ch.02.xsd">
  <CstmrCdtTrfInitn>
    <GrpHdr>
      <MsgId>MsgId-C001</MsgId>
      <CreDtTm>2016-08-01T00:00:00</CreDtTm>
      <NbOfTxs>5</NbOfTxs>
      <CtrlSum>4000.00</CtrlSum>
      <InitgPty>
        <Nm>Max Muster</Nm>
        <CtctDtls>
          <Nm>PF Testplattform</Nm>
          <Othr>Version 2.1</Othr>
        </CtctDtls>
      </InitgPty>
    </GrpHdr>
   <PmtInf>
      <PmtInfId>PmtInfId-C001-01</PmtInfId>
      <PmtMtd>TRF</PmtMtd>
      <BtchBookg>false</BtchBookg>
      <ReqdExctnDt>2017-03-01</ReqdExctnDt>
      <Dbtr><Nm>Max Muster</Nm></Dbtr>
      <DbtrAcct>
        <Id><IBAN>CH6309000000250097798</IBAN></Id>
        <Tp><Prtry>NOA</Prtry></Tp>
      </DbtrAcct>
      <DbtrAgt>
        <FinInstnId><BIC>POFICHBEXXX</BIC></FinInstnId>
      </DbtrAgt>
      <ChrgBr>CRED</ChrgBr>
      <CdtTrfTxInf>
        <PmtId>
          <InstrId>InstrId-C001-01-01</InstrId>
          <EndToEndId>EndToEndId-C001-01-01</EndToEndId>
        </PmtId>
        <PmtTpInf>
          <LclInstrm><Prtry>CH01</Prtry></LclInstrm>
        </PmtTpInf>
        <Amt><InstdAmt Ccy="EUR">1000.00</InstdAmt></Amt>
        <Cdtr><Nm>C001</Nm></Cdtr>
        <CdtrAcct><Id>
            <Othr><Id>010391391</Id></Othr>
        </Id></CdtrAcct>
        <RmtInf><Strd>
            <CdtrRefInf><Ref>120000000000234478943216899</Ref></CdtrRefInf>
        </Strd></RmtInf>
      </CdtTrfTxInf>
    </PmtInf>
    <PmtInf>
      <PmtInfId>PmtInfId-C001-02</PmtInfId>
      <PmtMtd>TRF</PmtMtd>
      <BtchBookg>false</BtchBookg>
      <ReqdExctnDt>2017-03-01</ReqdExctnDt>
      <Dbtr><Nm>Max Muster</Nm></Dbtr>
      <DbtrAcct>
        <Id><IBAN>CH6309000000250097798</IBAN></Id>
        <Tp><Prtry>NOA</Prtry></Tp>
      </DbtrAcct>
      <DbtrAgt>
        <FinInstnId><BIC>POFICHBEXXX</BIC></FinInstnId>
      </DbtrAgt>
      <ChrgBr>CRED</ChrgBr>
      <CdtTrfTxInf>
       <PmtId>
         <InstrId>InstrId-C001-02-01</InstrId>
          <EndToEndId>EndToEndId-C001-02-01</EndToEndId>
       </PmtId>
        <PmtTpInf>
          <LclInstrm><Prtry>CH01</Prtry></LclInstrm>
       </PmtTpInf>
        <Amt><InstdAmt Ccy="CHF">3000.00</InstdAmt></Amt>
        <Cdtr><Nm>C001</Nm></Cdtr>
        <CdtrAcct><Id>
            <Othr><Id>010391391</Id></Othr>
        </Id></CdtrAcct>
        <RmtInf><Strd>
            <CdtrRefInf><Ref>120000000000234478943216899</Ref></CdtrRefInf>
        </Strd></RmtInf>
      </CdtTrfTxInf>
    </PmtInf>
  </CstmrCdtTrfInitn>
</Document>

使用此XSLT文件:

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

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ld="http://www.six-interbank-clearing.com/de/pain.001.001.03.ch.02.xsd"
exclude-result-prefixes="ld"
ld:type = "GenericAccountIdentification1-CH" >

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

    <xsl:template match="ld:Document">
        <xsl:copy>
            <xsl:for-each-group select="ld:CstmrCdtTrfInitn/ld:PmtInf/ld:CdtTrfTxInf" group-by="ld:PmtId/ld:InstrId">
                <xsl:element name="Paiement">
                    <xsl:for-each select="current-group()">
                        <xsl:element name="MessageId">
                            <xsl:value-of select="../../ld:GrpHdr/ld:MsgId"/>
                        </xsl:element>
                        <xsl:element name="dateCredit">
                            <xsl:value-of select="../../ld:GrpHdr/ld:CreDtTm"/>
                        </xsl:element>
                        <xsl:element name="NbOfTxs">
                            <xsl:value-of select="../../ld:GrpHdr/ld:NbOfTxs"/>
                        </xsl:element>
                        <xsl:element name="CtrlSum">
                            <xsl:value-of select="../../ld:GrpHdr/ld:CtrlSum"/>
                        </xsl:element>
                        <xsl:element name="Ident">
                            <xsl:value-of select="../../ld:GrpHdr/ld:InitgPty/ld:Nm"/>
                        </xsl:element>
                        <xsl:element name="GroupePaiementsId">
                            <xsl:value-of select="../ld:PmtInfId"/>
                        </xsl:element>
                        <xsl:element name="PaiementType">
                            <xsl:value-of select="../ld:PmtMtd"/>
                        </xsl:element>
                        <xsl:element name="PaiementDate">
                            <xsl:value-of select="../ld:ReqdExctnDt"/>
                        </xsl:element>
                        <xsl:element name="Debiteur">
                            <xsl:value-of select="../ld:Dbtr/ld:Nm"/>
                        </xsl:element>
                        <xsl:element name="CompteDebiteur">
                            <xsl:value-of select="../ld:DbtrAcct/Id/ld:IBAN"/>
                        </xsl:element>
                        <xsl:element name="DebitCredit">
                            <xsl:value-of select="../ld:ChrgBr"/>
                        </xsl:element>
                        <xsl:element name="PaiementId">
                            <xsl:value-of select="current-grouping-key()"/>
                        </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/ld:InstdAmt/@Ccy"/>
                        </xsl:element>          
                        <xsl:element name="Montant">
                            <xsl:value-of select="ld:Amt/ld:InstdAmt"/>
                        </xsl:element>
                        <xsl:element name="CompteCredite">
                            <xsl:value-of select="ld:CdtrAcct/Id/ld:Othr/Id"/>
                        </xsl:element>
                        </xsl:for-each>
                </xsl:element>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

我获得:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="http://www.six-interbank-clearing.com/de/pain.001.001.03.ch.02.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Paiement xmlns="">
        <MessageId>MsgId-C001</MessageId>
        <dateCredit>2016-08-01T00:00:00</dateCredit>
        <NbOfTxs>5</NbOfTxs>
        <CtrlSum>4000</CtrlSum>
        <Ident>Max Muster</Ident>
        <GroupePaiementsId>PmtInfId-C001-01</GroupePaiementsId>
        <PaiementType>TRF</PaiementType>
        <PaiementDate>2017-03-01</PaiementDate>
        <Debiteur>Max Muster</Debiteur>
        <CompteDebiteur/>
        <DebitCredit>CRED</DebitCredit>
        <PaiementId>InstrId-C001-01-01</PaiementId>
        <Reference>120000000000234478943216899</Reference>
        <MontantCcy>EUR</MontantCcy>
        <Montant>1000</Montant>
        <CompteCredite/>
    </Paiement>
    <Paiement xmlns="">
        <MessageId>MsgId-C001</MessageId>
        <dateCredit>2016-08-01T00:00:00</dateCredit>
        <NbOfTxs>5</NbOfTxs>
        <CtrlSum>4000</CtrlSum>
        <Ident>Max Muster</Ident>
        <GroupePaiementsId>PmtInfId-C001-02</GroupePaiementsId>
        <PaiementType>TRF</PaiementType>
        <PaiementDate>2017-03-01</PaiementDate>
        <Debiteur>Max Muster</Debiteur>
        <CompteDebiteur/>
        <DebitCredit>CRED</DebitCredit>
        <PaiementId>InstrId-C001-02-01</PaiementId>
        <Reference>120000000000234478943216899</Reference>
        <MontantCcy>CHF</MontantCcy>
        <Montant>3000</Montant>
        <CompteCredite/>
    </Paiement>
</Document>

但最后一个元素没有价值。它来自:

    <CdtrAcct><Id>
        <Othr><Id>010391391</Id></Othr>
    </Id></CdtrAcct>

在XSD文件中,有几个不同类型的元素'Othr',我想要这个:

Document / CstmrCdtTrfInitn / PmtInf / CdtTrfTxInf / CdtrAcct / Id / Othr,类型为GenericAccountIdentification1-CH。

我尝试:

<xsl:param name="someType">xsd:GenericAccountIdentification1-CH"/></xsl:param>
<xsl:variable name="typeOthr" select="document($someType)"/>
...
<xsl:value-of select="ld:CdtrAcct/Id/ld:$typeOthr/Id"/>

我收到错误:意外的令牌'$ typeOther / Id'

我该怎么办?

1 个答案:

答案 0 :(得分:0)

如果要填充该空元素,就像使用其他元素一样,那么只需使用

即可
                    <xsl:element name="CompteCredite">
                        <xsl:value-of select="ld:CdtrAcct/ld:Id/ld:Othr/ld:Id"/>
                    </xsl:element>