2013-07-16 483 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