【问题标题】:CSV Data Parsing using XSLT 1.0使用 XSLT 1.0 解析 CSV 数据
【发布时间】:2012-10-11 05:59:57
【问题描述】:

我需要一些帮助来转换来自读取 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>

所需的输出是使用单词 Header 分类成块。

<?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>

干杯

【问题讨论】:

    标签: xslt-1.0


    【解决方案1】:

    这种转变

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

    产生想要的正确结果:

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

    【讨论】:

    • 非常感谢。我完全迷失了,无法开始。
    猜你喜欢
    • 2011-09-29
    • 2020-04-06
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2021-04-16
    • 2014-12-09
    相关资源
    最近更新 更多