使用XSL转换Excel XML

时间:2013-07-16 19:54:38

标签: xml excel xslt

我需要转换Excel XML电子表格,然后我可以将其导入另一个程序。使用普通的XML文档我没有问题,但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>

我的输出包括来自第一个单元格的数据反复重复。不知何故,我需要读取节点集然后前进到下一个...

谢谢

1 个答案:

答案 0 :(得分:0)

<强>更新即可。我在第一次阅读时错过了你的最后一句话。

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

  1. 您正在迭代行,但不是细胞。
  2. 您没有选择特定的Data元素。
  3. 您的模板应如下所示:

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