2012-10-11 58 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,不客气。 –