2013-05-23 2 views
1

저는 XSLT를 처음 사용하고있어서 누군가가 나를 도울 수 있기를 바라고 있습니다. 우리 서버에서 XML 문서를 얻었고이 파일을 CSV 파일로 변환 할 수 있어야합니다. 다음은 XML 파일의 예는 다음과 같습니다XSLT XML to CSV

<root> 
    <DataRow> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    </DataRow> 
    <DataRow> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    </DataRow> 
    <DataRow> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    <ColumnName>Value</ColumnName> 
    </DataRow> 
</root> 

나는 CSV로 XML을 변환 할 수 있어야하지만 난 XSL 템플릿 파일을 작성 힘든 시간을 보내고 누군가가 나를 도울 수 기대하고있다. 첫 번째 행은 열 이름이어야하고 두 번째 행과 그 너머는 값이어야합니다. 이런 식으로 XSLT 내부에서 가능합니까?

도움을 주시면 대단히 감사하겠습니다 !! 미리 감사드립니다.

+0

열을 하드 코드 할 수 있습니까? 즉, 항상 열 이름이 같습니까? 아니면 솔루션이 XML 파일을 검토하여 열 이름을 결정해야합니까? – mikey

+0

솔루션은 XML 파일을 검토하여 열 이름을 결정해야합니다. XML 파일의 열 이름이 다르기 때문에이 부분이 어려워집니다. –

답변

0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

    <xsl:template match="/">  
     <xsl:for-each select="/root/DataRow[1]/*"> 
      <xsl:if test="position()!=1"> 
       <xsl:value-of select="','"/> 
      </xsl:if> 
      <xsl:value-of select="name()"/> 
     </xsl:for-each> 
     <xsl:value-of select="'&#xA;'"/> 
     <xsl:for-each select="root/DataRow"> 
      <xsl:for-each select="*"> 
       <xsl:if test="position()!=1"> 
        <xsl:value-of select="','"/> 
       </xsl:if> 
       <xsl:value-of select="."/> 
      </xsl:for-each> 
      <xsl:value-of select="'&#xA;'"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:transform> 

이 스타일 시트를 사용해보십시오. 값에 대해 기본 템플릿과 중첩 루프를 사용합니다.

+0

제공된 샘플 xml로 위의 코드를 테스트 한 결과 올바른 형식의 CSV 파일이 수신되었습니다. –

0

일반적으로, 당신은 같은 것을 원하는 :

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:template match="root/DataRow"> 
    <xsl:if test="position() = 2"> 
      <xsl:for-each select="*"> 
     <xsl:if test="position() != 1"> 
     <xsl:value-of select="','"/> 
     </xsl:if> 
     <xsl:value-of select="name()"/> 
    </xsl:for-each> 
    <xsl:value-of select="'&#xA;'"/> 
    </xsl:if> 
    <xsl:for-each select="*"> 
    <xsl:if test="position() != 1"> 
     <xsl:value-of select="','"/> 
    </xsl:if> 
    <xsl:value-of select="."/> 
    </xsl:for-each> 
    <xsl:value-of select="'&#xA;'"/> 
</xsl:template> 

그래서 첫 번째 템플릿은 그대로, 열 머리글 행입니다, 그래서 열 이름이 있어야합니다. 내가 그들이 무엇인지 더 많이 안다면 자동으로 결정될 것입니다. 이들이 실제로 모두 "ColumnName"으로 명명되지 않은 경우 실제 예제가 많은 도움이됩니다.

+0

솔루션은 XML 파일을 검토하여 열 이름을 결정해야합니다. XML 파일의 열 이름이 다르기 때문에이 부분이 어려워집니다. –

+0

각 루트/DataRow 조합에 대해 별도의 출력이 있어야합니까? 또는 각 DataRow 블록에 대해 동일한 열 집합이 존재합니까? 즉, 첫 번째 행은 모든 DataRow의 합계에있는 모든 열의 집합이거나 모든 DataRow가 공통 열 집합을 공유하기 때문에 하나의 집합입니까? – DonBoitnott

+0

XML 파일에는 항상 동일한 열 이름이 포함되지만 XML 파일마다 다른 열 이름이 있습니다. XML1.xml에는 XML2.xml과 다른 특정 열 이름이 있습니다. 서로 다른 열 이름을 갖습니다. –