使用身份模板的XSLT 2.0

时间:2018-07-02 13:05:06

标签: xml xslt xslt-2.0

我需要有关xslt 2.0中身份模板转换的帮助,我现在尝试了几个小时,但未能实现。

输入

<?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 / PmtInf / CdtTrfTxInd / R / strong>是相同的,那么我需要如上所述的输出。如果它们不相同,则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 :(得分:1)

您已在XSLT中指定了默认名称空间,但这仅适用于您在XSLT中创建的无前缀元素(即<Ustrd>标记),但不适用于您的XPath表达式模板匹配。这意味着您的模板没有匹配任何元素,因此也没有被使用。

在使用XSLT 2.0时,只需在XSLT中添加xpath-default-namespace即可解决此问题,这样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>