2013-07-16 230 views
0

我需要转换Excel XML电子表格,以便将其导入到其他程序中。使用普通的XML文档我没有问题,但Excel XML文档是另一回事。我遇到问题的地方是从每个单元中提取我需要的数据。
必须有一些咒语,我不知道这将允许我遍历树以获取数据。 这里是我的样式表的一部分,看起来像:使用XSL转换Excel XML

<xsl:template match="ss:Table"> 
<xsl:for-each select="ss:Row"> 
    <Reload> 
    <xsl:value-of select="ss:Cell/ss:Data"/> 
    </Reload> 
    <vio_sta-id> 
    <xsl:value-of select="ss:Cell/ss:Data"/> 
    </vio_sta-id> 
    <vio-first> 
    <xsl:value-of select="ss:Cell/ss:Data"/> 
    </vio-first> 
    <vio-middle> 
     <xsl:value-of select="ss:Cell/ss:Data"/> 
    </vio-middle> 
    <vio-last> 
     <xsl:value-of select="ss:Cell/ss:Data"/> 
    </vio-last> 

这里是一个“行”从我收到的文件。

<ss:Row> 
<ss:Cell><Data ss:Type="String">Reload</Data></ss:Cell> 
<ss:Cell><Data ss:Type="Number">21</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">ANTHONY</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String"></Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">VALDEZ</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">01/28/1982</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">07318386</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">000-00-0000</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">Blank Field</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">638 W BAETZ</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String"></Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">SAN ANTONIO</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">TX</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">78221</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">06/21/1999</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">3259</Data></ss:Cell> 
<ss:Cell><Data ss:Type="Number">165.00</Data></ss:Cell> 
<ss:Cell><Data ss:Type="Number">0.00</Data></ss:Cell> 
<ss:Cell><Data ss:Type="Number">0.00</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">8880</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">New</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">00/00/0000</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">PENDING</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">FRED NIETO JR.</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">ZIMMERMAN #700</Data></ss:Cell> 
<ss:Cell><Data ss:Type="String">EXP. 1-99::NEW::0</Data></ss:Cell> 
<ss:Cell><Data ss:Type="Number">10</Data></ss:Cell> 
<ss:Cell><Data ss:Type="Number">5</Data></ss:Cell> 

我的输出包括来自第一小区一遍又一遍地重复数据..不知怎的,我需要阅读的节点集合,然后前进到下一个...

谢谢

+0

我建议你清理你的样品。它似乎包含真实用户的个人信息。 – harpo

+0

我建议你在继续之前停下来学习名称空间和命名空间前缀。 –

回答

0

UPDATE。我在一读时错过了最后一次发言。

你的方法有两个基本问题:

  1. 您是通过迭代行,而不是细胞。
  2. 您未选择特定的Data元素。

您的模板应该是这样的:

<xsl:for-each select="ss:Row"> 
     <Reload> 
      <xsl:value-of select="ss:Cell[1]/ss:Data"/> 
     </Reload> 
     <vio_sta-id> 
      <xsl:value-of select="ss:Cell[2]/ss:Data"/> 
     </vio_sta-id> 

    <!-- etc --> 

</xsl:for-each> 

(原来的答复的情况下,它仍然有助于理解离开这个。)

Data元素没有前缀:

<ss:Cell><Data ss:Type="String">06/21/1999</Data></ss:Cell> 

但是,您的选择器将它们作为前缀ss

<xsl:value-of select="ss:Cell/ss:Data"/> 

这不起作用,除非默认名称空间恰好与前缀ss具有相同的URI。

尝试改写选择为

<xsl:value-of select="ss:Cell/Data"/> 
+0

这没有做我想做的事。如果我将样式表更改为所提供的示例,我会收到一个列表 – Sleepy

+0

,它不起作用。我更改为建议的样式表,然后我得到重新加载然后所有文本,然后 Jesse。我不认为每个单元格都是我需要做的。 我想读取行元素,然后读取它保存的数据的每个单元格。 – Sleepy

+0

好吧,我拿过你的例子,拿出了XSL :对于每个单元格,然后简单地使用单元格的括号.ie ss:Cell [1],它为我提供了我正在查找的数据。我在考虑进入DATA级别对于索引来说太深了,但是肯定我不是一个XPATH大师。 – Sleepy