0

XSLTを使用して1つの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 ID変換に基づいて構築することです。これは、それ自体で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 に答える