XSLT 2.0 с использованием шаблона идентификации - PullRequest
0 голосов
/ 02 июля 2018

Мне потребуется помощь по преобразованию шаблонов идентичности в xslt 2.0, я пробовал это несколько часов, но не смог этого добиться.

Input

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
   <CstmrCdtTrfInitn>
      <GrpHdr>
         <MsgId>16</MsgId>
      </GrpHdr>
      <PmtInf>
         <PmtInfId>161</PmtInfId>
         <PmtMtd>TRF</PmtMtd>
         <BtchBookg>false</BtchBookg>
         <NbOfTxs>1</NbOfTxs>
         <CtrlSum>0.01</CtrlSum>
         <ChrgBr>SL</ChrgBr>
         <CdtTrfTxInf>
            <PmtId>
               <InstrId>EFT</InstrId>
            </PmtId>
            <Purp>
               <Prtry>DEP</Prtry>
            </Purp>
            <RmtInf>
               <Strd>
                  <RfrdDocInf>
                     <Tp>
                        <CdOrPrtry>
                           <Cd>SOAC</Cd>
                        </CdOrPrtry>
                     </Tp>
                     <Nb>643525145</Nb>
                     <RltdDt>2018-01-01-07:00</RltdDt>
                  </RfrdDocInf>
                  <RfrdDocAmt>
                     <DuePyblAmt Ccy="EUR">0.01</DuePyblAmt>
                     <RmtdAmt Ccy="EUR">0.01</RmtdAmt>
                  </RfrdDocAmt>
                  <CdtrRefInf>
                     <Ref>643525145</Ref>
                  </CdtrRefInf>
               </Strd>
            </RmtInf>
         </CdtTrfTxInf>
      </PmtInf>
   </CstmrCdtTrfInitn>
</Document>

выход

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
   <CstmrCdtTrfInitn>
      <GrpHdr>
         <MsgId>16</MsgId>
      </GrpHdr>
      <PmtInf>
         <PmtInfId>161</PmtInfId>
         <PmtMtd>TRF</PmtMtd>
         <BtchBookg>false</BtchBookg>
         <NbOfTxs>1</NbOfTxs>
         <CtrlSum>0.01</CtrlSum>
         <ChrgBr>SL</ChrgBr>
         <CdtTrfTxInf>
            <PmtId>
               <InstrId>EFT</InstrId>
            </PmtId>
            <Purp>
               <Prtry>DEP</Prtry>
            </Purp>
            <RmtInf>
               <Ustrd>643525145</Ustrd>
            </RmtInf>
         </CdtTrfTxInf>
      </PmtInf>
   </CstmrCdtTrfInitn>
</Document>

Если xpath / Document / CstmrCdtTrfInitn / PmtInf / CdtTrfTxInf / RmtInf / Strd / RfrdDocInf / Nb и / Document / CstmrCdtTrfInitn / PttInf / rttff то же самое, тогда мне понадобится вывод, как указано выше. Если они не совпадают, то xslt должен вернуть входные данные без изменений.

Я пробовал этот код xslt, но он не работал.

XSLT:

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

<xsl:stylesheet version="2.0"
    xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<xsl:template match='@* | node()'>
            <xsl:copy>
              <xsl:apply-templates select='@* | node()'/>
            </xsl:copy>
        <!--/xsl:if-->
 </xsl:template>

<xsl:template match='Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/RmtInf'> 
<xsl:if test="Strd/RfrdDocInf/Nb=Strd/CdtrRefInf/Ref">
    <xsl:copy>
        <Ustrd>
                <xsl:value-of select="Strd/CdtrRefInf/Ref"/>
        </Ustrd>
    </xsl:copy>
 </xsl:if>
 </xsl:template>
</xsl:stylesheet>

Пожалуйста, кто-нибудь может помочь мне достичь результата, спасибо.

1 Ответ

0 голосов
/ 02 июля 2018

Вы указали пространство имен по умолчанию в своем XSLT, но это относится только к нефиксированным элементам, которые вы создаете в своем XSLT (т. Е. Тегу <Ustrd>), но оно не применяется к вашим выражениям xpath в совпадении вашего шаблона. , Это означает, что ваш шаблон не соответствует ни одному элементу и поэтому не используется.

Поскольку вы используете XSLT 2.0, вы можете решить эту проблему, просто добавив xpath-default-namespace к вашему XSLT, чтобы любые нефиксированные элементы в выражениях xpath обрабатывались так же, как в этом пространстве имен.

Попробуйте это XSLT

<xsl:stylesheet version="2.0"
    xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
    xpath-default-namespace="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    exclude-result-prefixes="xsi">

<xsl:template match='@* | node()'>
    <xsl:copy>
      <xsl:apply-templates select='@* | node()'/>
    </xsl:copy>
 </xsl:template>

<xsl:template match='Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf/RmtInf'> 
<xsl:if test="Strd/RfrdDocInf/Nb=Strd/CdtrRefInf/Ref">
    <xsl:copy>
        <Ustrd>
                <xsl:value-of select="Strd/CdtrRefInf/Ref"/>
        </Ustrd>
    </xsl:copy>
 </xsl:if>
 </xsl:template>
</xsl:stylesheet>
...