使用XSLT模板将一个Xml文档转换为另一个Xml文档时的空节点值

时间:2014-03-05 12:44:52

标签: xml xslt xslt-1.0

在从银行导入XML文档之前,我需要将某些节点值转换为小写。目前,输出导致从原始节点中删除所有值,除了我实际转换的节点。我有什么明显的遗失吗?

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

  <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
  <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

  <xsl:template match="iso20022:Document">
      <xsl:apply-templates select="*"/>
  </xsl:template>

  <xsl:template match="iso20022:RvslInd">
    <RvslInd>
      <xsl:value-of select="translate(., $uppercase, $lowercase)" />
    </RvslInd>
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="*"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

以下是我得到的输出的缩写示例摘录:

<?xml version="1.0" encoding="UTF-8"?>
<BkToCstmrStmtV02 xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">
   <GrpHdr>
      <MsgId />
      <CreDtTm />
      <MsgRcpt>
         <Nm />
         <PstlAdr>
            <AdrTp />
            <StrtNm />
            <BldgNb />
            <PstCd />
            <TwnNm />
            <CtrySubDvsn />
            <Ctry />
            <AdrLine />
         </PstlAdr>
      </MsgRcpt>
      <AddtlInf />
   </GrpHdr>
   <Stmt>
      <Id />
      <ElctrncSeqNb />
      <CreDtTm />
      <FrToDt>
         <FrDtTm />
         <ToDtTm />
      </FrToDt>
      <RptgSrc>
         <Cd />
      </RptgSrc>
      <Acct>
         <Id>
            <Othr>
               <Id />
               <SchmeNm>
                  <Prtry />
               </SchmeNm>
            </Othr>
         </Id>
         <Ccy />
         <Nm />
         <Svcr>
            <FinInstnId>
               <ClrSysMmbId>
                  <ClrSysId>
                     <Prtry />
                  </ClrSysId>
                  <MmbId />
               </ClrSysMmbId>
               <Nm />
            </FinInstnId>
         </Svcr>
      </Acct>
      <Bal>
         <Tp>
            <CdOrPrtry>
               <Cd />
            </CdOrPrtry>
         </Tp>
         <Amt />
         <CdtDbtInd />
         <Dt>
            <Dt />
         </Dt>
      </Bal>
      <Bal>
         <Tp>
            <CdOrPrtry>
               <Cd />
            </CdOrPrtry>
         </Tp>
         <Amt />
         <CdtDbtInd />
         <Dt>
            <Dt />
         </Dt>
      </Bal>
      <Bal>
         <Tp>
            <CdOrPrtry>
               <Cd />
            </CdOrPrtry>
         </Tp>
         <Amt />
         <CdtDbtInd />
         <Dt>
            <Dt />
         </Dt>
      </Bal>
      <Bal>
         <Tp>
            <CdOrPrtry>
               <Cd />
            </CdOrPrtry>
         </Tp>
         <Amt />
         <CdtDbtInd />
         <Dt>
            <Dt />
         </Dt>
      </Bal>
      <TxsSummry>
         <TtlNtries>
            <NbOfNtries />
            <Sum />
            <TtlNetNtryAmt />
            <CdtDbtInd />
         </TtlNtries>
         <TtlCdtNtries>
            <NbOfNtries />
            <Sum />
         </TtlCdtNtries>
         <TtlDbtNtries>
            <NbOfNtries />
            <Sum />
         </TtlDbtNtries>
      </TxsSummry>
      <Ntry>
         <Amt />
         <CdtDbtInd />
         <RvslInd xmlns="">false</RvslInd>
         <Sts />
         <BookgDt>
            <Dt />
         </BookgDt>
         <ValDt>
            <Dt />
         </ValDt>
         <BkTxCd>
            <Prtry>
               <Cd />
               <Issr />
            </Prtry>
         </BkTxCd>
         <NtryDtls>
            <TxDtls>
               <Refs>
                  <EndToEndId />
               </Refs>
            </TxDtls>
         </NtryDtls>
         <AddtlNtryInf />
      </Ntry>
   </Stmt>
</BkToCstmrStmtV02>

1 个答案:

答案 0 :(得分:1)

我在猜测(没有提供任何输入)您要更改此内容:

<xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates select="*"/>
    </xsl:copy>
</xsl:template>

为:

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

前者仅复制元素。后者复制所有内容 - 包括text()节点。