通过XSLT将XML转换为平面文件

时间:2013-07-26 17:47:09

标签: xml xslt

尝试将以下类型的XML文件转换为平面文件或csv。我能够为其他XML格式生成XSLT文件,但我真的不明白如何使用这种格式的树结构。有什么想法吗?我已经尝试了一下,但我对XSLT不够熟悉。

  <observations 
        realtime_start="2013-02-08" 
        realtime_end="2013-02-08"  
        observation_start="1776-07-04" 
        observation_end="9999-12-31" units="lin"   
        output_type="2"  
        file_type="xml" 
        order_by="observation_date" 
        sort_order="asc" 
        count="792" offset="0"        
        limit="100000">
    <observation date="1947-01-01" CPIAUCSL_20130208="21.48"/>
    <observation date="1947-02-01" CPIAUCSL_20130208="21.62"/>
    <observation date="1947-03-01" CPIAUCSL_20130208="22.0"/>
  </observations>

1 个答案:

答案 0 :(得分:4)

此示例是否足够?

T:\ftemp>type obs.xml
<?xml version="1.0" encoding="UTF-8"?>
  <observations realtime_start="2013-02-08" realtime_end="2013-02-08"
  observation_start="1776-07-04" observation_end="9999-12-31" units="lin"
  output_type="2" file_type="xml" order_by="observation_date" sort_order="asc"
  count="792" offset="0"        limit="100000">
  <observation date="1947-01-01" CPIAUCSL_20130208="21.48"/>
  <observation date="1947-02-01" CPIAUCSL_20130208="21.62"/>
  <observation date="1947-03-01" CPIAUCSL_20130208="22.0"/>
  </observations>

T:\ftemp>xslt obs.xml obs.xsl obs.csv

T:\ftemp>type obs.csv
date,CPIAUCSL
1947-01-01,21.48
1947-02-01,21.62
1947-03-01,22.0

T:\ftemp>type obs.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:output method="text"/>

<xsl:template match="observations">
  <xsl:text>date,CPIAUCSL&#xa;</xsl:text>
  <xsl:for-each select="observation">
    <xsl:value-of select="@date"/>,<xsl:value-of select="@CPIAUCSL_20130208"/>
    <xsl:text>&#xa;</xsl:text>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
T:\ftemp>

输出文本的关键是序列化到文件的是结果树的所有文本节点。结果树中的任何元素或属性节点都会被忽略,所以甚至不用去尝试创建它们......只需创建文本节点,它们都会连接到输出中。

为了进入另一个方向,从CSV到XML,我已经免费提供http://www.CraneSoftwrights.com/resources/#csv包(并且它也适用于TSV文件),以便与XSLT 2.0一起使用。