0

我想使用 XSLT 将一种 xml 格式转换为另一种 xml 格式。下面是我需要转换为另一种 XML 格式的输入 XML 格式。

<FIXML>
    <Header>
        <RequestID>ReqID8942</RequestID>
        <RequestType>DocGen</RequestType>
        <Version>10.6</Version>
        <BankId>01</BankId>
        <ChannelId>LOS</ChannelId>
    </Header>
    <Body>
        <Data>
         <CorpAppLimitDetailsBO>
            <ApprovedLimitHomeCCY>100.0</ApprovedLimitHomeCCY>
            <ApprovedLimitCCY>INR</ApprovedLimitCCY>
            <ApprovedLimit>100.0</ApprovedLimit>
            <LimitClassification>ROOT</LimitClassification>
        <DBApplicantMiscDetails>
                    <APPLICANTMISCID>400000</APPLICANTMISCID>
                    <APPLICANTID>400030</APPLICANTID>
                    <MISCTYPE>APPLIED</MISCTYPE>
            </DBApplicantMiscDetails>
        </CorpAppLimitDetailsBO>
       </Data>
     </Body>
</FIXML>

下面是我期望的输出格式 xml。

<FIXML>
    <Header>
        <RequestID>ReqID8942</RequestID>
        <RequestType>DocGen</RequestType>
        <Version>10.6</Version>
        <BankId>01</BankId>
        <ChannelId>LOS</ChannelId>
    </Header>
    <Body>
        <Data>
            <LimitDetails>
            <Limit>
                <ApprovedLimitHomeCCY>100.0</ApprovedLimitHomeCCY>
                <ApprovedLimitCCY>INR</ApprovedLimitCCY>
                <ApprovedLimit>100.0</ApprovedLimit>
                <LimitClassification>ROOT</LimitClassification>
        <APPLICANTMISCID>400000</APPLICANTMISCID>
        <APPLICANTID>400030</APPLICANTID>
        <MISCTYPE>APPLIED</MISCTYPE>
            </Limit>
       </Data>
     </Body>
</FIXML>

我已尝试使用以下代码,但不知道如何修改代码以在输出 XML 格式中包含 DBApplicantMiscDetails 详细信息。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates select="FIXML"/>
    </xsl:template>
    <xsl:template match="FIXML">
        <FIXML>
            <xsl:apply-templates select="Header"/>
            <xsl:apply-templates select="Body"/>
        </FIXML>
    </xsl:template>
    <xsl:template match="Header">
        <xsl:copy-of select="."/>
    </xsl:template>
    <xsl:template match="Body">
        <Body>
            <xsl:apply-templates select="Data"/>
        </Body>
    </xsl:template>
    <xsl:template match="Data">
        <Data>
            <LimitDetails>
                <xsl:apply-templates select="CorpAppLimitDetailsBO"/>
            </LimitDetails>
        </Data>
    </xsl:template>
    <xsl:template match="CorpAppLimitDetailsBO">
        <Limit>
            <xsl:copy-of select="child::*"/>
        </Limit>
    </xsl:template>
 </xsl:stylesheet>
4

1 回答 1

0

您可能解决此问题的方法是建立在 XSLT 身份转换的基础上,它自己只是复制 XML 中的节点

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

然后,您添加模板以匹配您想要进行更改的特殊情况(而不是为您只想复制的元素编写模板)。例如,要将CorpAppLimitDetailsBO重命名为Limit,您可以这样做

<xsl:template match="CorpAppLimitDetailsBO"> 
    <Limit> 
        <xsl:apply-templates /> 
    </Limit> 
</xsl:template> 

然后删除 DBApplicationMiscDetails 成为一项简单的任务

<xsl:template match="DBApplicantMiscDetails"> 
     <xsl:apply-templates /> 
</xsl:template> 

这是完整的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

    <xsl:template match="Data"> 
        <Data> 
            <LimitDetails> 
                <xsl:apply-templates /> 
            </LimitDetails> 
        </Data> 
    </xsl:template>

    <xsl:template match="CorpAppLimitDetailsBO"> 
        <Limit> 
            <xsl:apply-templates /> 
        </Limit> 
    </xsl:template> 

    <xsl:template match="DBApplicantMiscDetails"> 
            <xsl:apply-templates /> 
    </xsl:template> 

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

应用于您的示例 XML 时,将输出以下内容

<FIXML>
   <Header>
      <RequestID>ReqID8942</RequestID>
      <RequestType>DocGen</RequestType>
      <Version>10.6</Version>
      <BankId>01</BankId>
      <ChannelId>LOS</ChannelId>
   </Header>
   <Body>
      <Data>
         <LimitDetails>
            <Limit>
               <ApprovedLimitHomeCCY>100.0</ApprovedLimitHomeCCY>
               <ApprovedLimitCCY>INR</ApprovedLimitCCY>
               <ApprovedLimit>100.0</ApprovedLimit>
               <LimitClassification>ROOT</LimitClassification>
               <APPLICANTMISCID>400000</APPLICANTMISCID>
               <APPLICANTID>400030</APPLICANTID>
               <MISCTYPE>APPLIED</MISCTYPE>
            </Limit>
         </LimitDetails>
      </Data>
   </Body>
</FIXML>
于 2012-10-10T06:36:56.653 回答