2012-10-10 40 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