2012-10-10 45 views
0

我想使用XSLT将一个xml格式转换为另一种xml格式。 下面是我需要转换为另一种XML格式的输入XML格式。通过XSLT将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> 

我曾尝试下面的代码,但不知道如何修改代码以inlcude输出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> 
+0

您的输出XML存在一个小错误,因为'LimitDetails'没有结束标记。此外,你说你想包含'DBApplicantMiscDetails',但你的示例XML看起来像你想要删除它。它是否正确?谢谢! –

回答

0

你很可能在处理这个问题的方法是建立在XSLT恒等变换,这对自己只是复制在你的XML节点

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

然后添加模板,以满足您的特殊情况您想要进行更改的位置(与您仅需要复制的元素的书面模板相反)。例如,重命名CorpAppLimitDetailsBO限制你这样做

<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> 
+0

Tim.Brillient.your的答案减少了我的努力很多。谢谢。我得到了一些空行输出xml.will它可以从输出xml中删除空行。 – Moorthy

+0

我相信这是可能的,尽管您需要准确定义“空行”是什么。如果您无法解决问题,请随时提出一个新问题。 –

+0

使用删除空格/ line.thanks – Moorthy