转换XML格式以与Access Import兼容

时间:2013-03-04 21:06:55

标签: xml vba xslt

这与之前的帖子有关。我试图将经济数据从StLouisFred导入Access。我最终将这个数据库用于excel。我是学生,这项任务虽然简单,但却超出了我的经验。我还尝试将XML数据导入Excel,但格式仍然是一个问题。我知道FRED使用CSV,但你不能自动更新CSV,所以我想使用XML。数据格式如下:

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

我正在尝试将数据转换为Access更喜欢的其他标准xml格式。像这样:

<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 </date>
 <value> 21.48 </value> 
 <observation/>

 <observation> 
 <date>1947-02-01</date> 
 <value>21.62</value>
 </observation>

 <observation> 
 <date>1947-03-01</date> <value>22.0</value>
 </observation>

 </observations>

这似乎有用。 Access能够使用样式表,我很乐意尝试,但我需要一些细微的演练。因此,假设我有一张第一个xml格式的信息。有没有办法让我将数据转换为Access,以便我可以有一个自动更新的表,或者这是一个绝望的项目?

1 个答案:

答案 0 :(得分:2)

这是一个简单的XSLT转换:

<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:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="observation/@date">
  <date><xsl:value-of select="."/></date>
 </xsl:template>

 <xsl:template match="observation/@*[starts-with(name(),'CPIAUCSL_')]">
  <value><xsl:value-of select="."/></value>
 </xsl:template>
</xsl:stylesheet>

并且在提供的XML文档上应用此转换时:

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

产生了想要的正确结果:

<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</date>
      <value>21.48</value>
   </observation>
   <observation>
      <date>1947-02-01</date>
      <value>21.62</value>
   </observation>
   <observation>
      <date>1947-03-01</date>
      <value>22.0</value>
   </observation>
</observations>