2011-05-04 3 views
2

XML 용 XSLT를 CSV로 변환하는 방법을 모르겠습니다. 모든 원래의 쉼표 따옴표 등XML 구조에 대한 XSLT (CSV 용)

<DROPSHIPITEMS> 
    <CREATED value="Thu Apr 21 23:17:39 BST 2011"> 
    <PRODUCT ITEM='8101'> 
     <MODEL>FY316A</MODEL> 
     <EAN>5055071647109</EAN> 
     <NAME>Enchanted Twilight Flower Fairy 'Amethyst'</NAME> 
     <DESCRIPTION><![CDATA[<p> Twilight Fairy 'Amethyst'</p><p>This, Fairy.</p>]]></DESCRIPTION> 
     <DIMENSION><![CDATA[Height 31 - 32cm Width, 16 - 18.5cm Depth 12 - 13.5cm]]></DIMENSION> 
     <PRICE>16.63</PRICE> 
     <DELIVERY>I</DELIVERY> 
     <QUANTITY>224</QUANTITY> 
     <MIN_ORDER_QTY>1</MIN_ORDER_QTY> 
     <URL>http://www.abc-dropship.co.uk/gifts/product_info.php?products_id=8101</URL> 
     <IMAGE_URL>http://www.abc-dropship.co.uk/gifts/images/FY316A_001.jpg</IMAGE_URL> 
     <CATEGORIES>9003|100297</CATEGORIES> 
     <OPTIONS><![CDATA[B - Hand on Dress|A - Flower in Hand|Any]]></OPTIONS> 
    </PRODUCT> 
</CREATED> 
</DROPSHIPITEMS> 

감사

+0

형식입니다. CSV는 형식 일뿐입니다. 어떤 XML 요소가 CSV에 들어가야합니까? 너 뭔가 묶어 놨니? – MarcoS

+0

나는 이미 이와 비슷한 질문에 대답했다 : http://stackoverflow.com/questions/3056579/convert-xml-document-to-comma-delimited-csv-file-using-xslt-stylesheet/3060630#3060630보세요 그 링크에서, 당신에게 충분한 도움을 주어야한다. – Flynn1179

답변

1

이 delimeted 쉼표로 ​​XML을 변환하려면 어떤 다른처럼 동일합니다 XML의 주어진 구조에 대한 XSLT를 코딩하고 확인하려고 고려하시기 바랍니다 변환. 다음은 필드를 그대로 재현합니다. 모든 PRODUCT에서 동일한 순서로 처리하지 않으면 필드를 처리해야합니다. 이 예는 시작 얻을 것이다 :

<xsl:output method="text"/> 

    <xsl:template match="//PRODUCT"> 
     <xsl:value-of select="@ITEM" /> 
    <xsl:text>,</xsl:text> 
    <xsl:apply-templates select="./*" /> 
    <xsl:text>&#x0A;</xsl:text> 
    </xsl:template> 

    <xsl:template match="PRODUCT/*"> 
     <xsl:value-of select="translate(text(), ',', '@')" /> 
    <xsl:text>,</xsl:text> 
    </xsl:template> 

Btw는의 &#0A; 당신이 너무 &#0D;을 추가해야 할 수도 있습니다 DOS/Windows의 경우, 줄 바꿈을 추가합니다.

업데이트 : 쉼표 값은 translate() 기능을 사용하여 다른 문자로 바꾸면 값을 이스케이프 할 수 있습니다.

+0

고맙습니다 rsp, XSL 잘 작동하지만 Discription 요소의 데이터에있는 원래 쉼표를 처리하지 않습니다. 여기에는 원본 텍스트에있는 쉼표도 포함됩니다. 그래서 가져올 경우, 그것은 분명히 별도의 열을 생성하므로이 문제를 어떻게 다룰 것인가? – Mehboob

+0

@Mehboob, update를 참조하십시오 - @ 당신의 선택을 대체하지 않을 수도 있지만 쉽게 자리 잡을 수 있습니다 :-) – rsp

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"/> 

    <xsl:template match="/"> 
    <xsl:for-each select="*/*/*[1]/*"> 
     <xsl:value-of select="name()" /> 
     <xsl:if test="not(position() = last())">,</xsl:if> 
    </xsl:for-each> 
    <xsl:text>&#10;</xsl:text> 
    <xsl:apply-templates select="*/*/*" mode="row"/> 
    </xsl:template> 

    <xsl:template match="*" mode="row"> 
    <xsl:apply-templates select="*" mode="data" /> 
    <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

    <xsl:template match="*" mode="data"> 
    <xsl:choose> 
     <xsl:when test="contains(text(),',')"> 
     <xsl:text>&quot;</xsl:text> 
     <xsl:call-template name="doublequotes"> 
      <xsl:with-param name="text" select="text()" /> 
     </xsl:call-template> 
     <xsl:text>&quot;</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="." /> 
     </xsl:otherwise> 
    </xsl:choose> 
    <xsl:if test="position() != last()">,</xsl:if> 
    </xsl:template> 

    <xsl:template name="doublequotes"> 
    <xsl:param name="text" /> 
    <xsl:choose> 
     <xsl:when test="contains($text,'&quot;')"> 
     <xsl:value-of select="concat(substring-before($text,'&quot;'),'&quot;&quot;')" /> 
     <xsl:call-template name="doublequotes"> 
      <xsl:with-param name="text" select="substring-after($text,'&quot;')" /> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$text" /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

이 제대로뿐만 아니라 따옴표와 쉼표로 필드 및 필드를 처리합니다.

편집 : 거의 잊었습니다. 이 템플릿은 필드 이름이있는 헤더 행을 추가합니다. 필요하지 않으면 첫 번째 템플릿은