2012-10-11 59 views
1

我需要一些幫助來轉換來自讀取csv文件的輸入數據。我想將它轉換成更智能一點的結構。我認爲可能有一些累積處理,但不知道如何去做。使用XSLT 1.0的CSV數據分析

我的輸入XML:

<lines> 
    <line number="1">Header, some header data 1</line> 
    <line number="2">Data, some data for 1</line> 
    <line number="3">Data, some data for 1</line> 
    <line number="4">Header, some header data for 2</line> 
    <line number="5">Data some data for 2</line> 
</lines> 

要求輸出到分爲使用字頭塊。

<?xml version="1.0" encoding="UTF-8"?> 
<lines> 
    <Block> 
     <line number="1">Header, some header data 1</line> 
     <line number="2">Data, some data for 1</line> 
     <line number="3">Data, some data for 1</line> 
    </Block> 
    <Block> 
     <line number="4">Header, some header data for 2</line> 
     <line number="5">Data some data for 2</line> 
    </Block> 
</lines> 

歡呼聲

回答

0

該轉化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kFollowing" match="line[not(substring-before(.,',')='Header')]" 
    use="generate-id(preceding-sibling::line[substring-before(.,',')='Header'][1])" 
    /> 

<xsl:template match="/*"> 
    <lines> 
     <xsl:apply-templates select="*[substring-before(.,',')='Header']"/> 
    </lines> 
</xsl:template> 

<xsl:template match="line"> 
    <Block> 
    <xsl:copy-of select=".|key('kFollowing', generate-id())"/> 
    </Block> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔應用:

<lines> 
    <line number="1">Header, some header data 1</line> 
    <line number="2">Data, some data for 1</line> 
    <line number="3">Data, some data for 1</line> 
    <line number="4">Header, some header data for 2</line> 
    <line number="5">Data some data for 2</line> 
</lines> 

產生第e想要的,正確的結果:

<lines> 
    <Block> 
     <line number="1">Header, some header data 1</line> 
     <line number="2">Data, some data for 1</line> 
     <line number="3">Data, some data for 1</line> 
    </Block> 
    <Block> 
     <line number="4">Header, some header data for 2</line> 
     <line number="5">Data some data for 2</line> 
    </Block> 
</lines> 
+0

非常感謝。我完全迷失了,無法開始。 – Rahul

+0

@Rahul,不客氣。 –