2010-02-12 9 views
3

XSLT를 사용하여 XML 파일을 텍스트로 변환하려고하지만 XSLT를 사용해 본 경험이 없습니다.XSLT를 사용하여 XML을 텍스트 파일로 변환하는 방법

다음은 샘플 XML 파일입니다 :

<DOC xsi:noNamespaceSchemaLocation="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<DOC_REQUISITES DOC_DATE="2009-04-23" DOC_NO="99999999"/> 
<DOCID TradeDate="2009-04-23" Weekday="Monday" MainFirmId="ZXC0000" FirmName="Firm Name" FirmINN="1234567899"> 
    <FIRM FirmID="FirmId"> 
    <CURRENCY CurrencyId="USD"> 
    <DEPARTMENT DepartmentId="ABCD" DepName="Department Name1"> 
    <SETTLEDATE SettleDate="2009-04-23"> 
     <SECURITY SecurityId="QAZ" SecShortName="SecName1" SecurityType="dc" FaceValue="5"> 
     <TRDACC TrdAccId="ABC00000"> 
     <RECORDS RecNo="1" TradeNo="111" TradeTime="15:15:16" Price="10" Quantity="50" Value="500"/> 
     </TRDACC> 
     <TRDACC TrdAccId="SDC00000"> 
     <RECORDS RecNo="2" TradeNo="112" TradeTime="15:15:16" Price="10" Quantity="50" Value="500"/> 
     <RECORDS RecNo="3" TradeNo="113" TradeTime="15:15:16" Price="20" Quantity="10" Value="200"/> 
     </TRDACC> 
     </SECURITY> 
     <SECURITY SecurityId="WSX" SecShortName="SecName2" SecurityType="dc" FaceValue="1"> 
     <TRDACC TrdAccId="ABC00000"> 
     <RECORDS RecNo="4" TradeNo="114" TradeTime="15:15:13" Price="2" Quantity="1" Value="2"/> 
     </TRDACC> 
     </SECURITY> 
    </SETTLEDATE> 
    </DEPARTMENT> 
    <DEPARTMENT DepartmentId="CBSD" DepName="Department Name2"> 
    <SETTLEDATE SettleDate="2009-05-20"> 
     <SECURITY SecurityId="RFV" SecShortName="SecName3" SecurityType="dc" FaceValue="2"> 
     <TRDACC TrdAccId="SDC00000"> 
     <RECORDS RecNo="5" TradeNo="115" TradeTime="15:15:13" Price="100" Quantity="10" Value="1000"/> 
     </TRDACC> 
     </SECURITY> 
    </SETTLEDATE> 
    </DEPARTMENT> 
    </CURRENCY> 
    </FIRM> 
</DOCID> 
</DOC> 

내 원하는 출력은 다음과 같습니다

2009-04-23,99999999,2009-04-23,Monday,ZXC0000,Firm Name,1234567899,FirmId,USD,ABCD,Department Name1,2009-04-23,QAZ,SecName1,dc,5,ABC00000,1,111,15:15:16,10,50,500 
2009-04-23,99999999,2009-04-23,Monday,ZXC0000,Firm Name,1234567899,FirmId,USD,ABCD,Department Name1,2009-04-23,QAZ,SecName1,dc,5,SDC00000,2,112,15:15:16,10,50,500 
2009-04-23,99999999,2009-04-23,Monday,ZXC0000,Firm Name,1234567899,FirmId,USD,ABCD,Department Name1,2009-04-23,QAZ,SecName1,dc,5,SDC00000,3,113,15:15:16,20,10,200 
2009-04-23,99999999,2009-04-23,Monday,ZXC0000,Firm Name,1234567899,FirmId,USD,ABCD,Department Name1,2009-04-23,WSX,SecName2,dc,1,ABC00000,4,114,15:15:13,2,1,2 
2009-04-23,99999999,2009-04-23,Monday,ZXC0000,Firm Name,1234567899,FirmId,USD,CBSD,Department Name2,2009-05-20,RFV,SecName3,dc,2,SDC00000,5,115,15:15:13,100,10,1000 
+0

당신은 샘플 XML을 편집시겠습니까? 올바르게 복사되지 않았거나 누락 된 것이 있습니다. –

답변

2
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="/DOC/DOCID/FIRM/CURRENCY/DEPARTMENT/SETTLEDATE/SECURITY/TRDACC"/> 
    </xsl:template> 

<xsl:template match="TRDACC"> 
    <!--Select all of the attribute values from the preceding DOC_REQUISITES attibutes, TRDACC ancestor elements, the current element, and all of it's descendants and then apply-templates to those attributes --> 
    <xsl:apply-templates select="preceding::DOC_REQUISITES/@* | ancestor::*[not(local-name()='DOC')]/@* | @* | descendant::*/@*"/> 
    <!--Adds a carriage return at the end of the line --> 
    <xsl:value-of select="'&#10;'"/> 
</xsl:template> 

<!--Template match for attributes that emits the attribute value and a ',', except for the last one --> 
<xsl:template match="@*[.!='']"> 
    <xsl:value-of select="."/> 
    <xsl:if test="position()!=last()">,</xsl:if> 
</xsl:template> 

</xsl:stylesheet> 
+0

''여기 올바르지 않습니다. –

+0

@ 마크 - 업데이트 중입니다. output 지시문은 텍스트와 omit-xml-declaration로 설정됩니다. –

관련 문제