2013-07-16 3 views
0

Мне нужно преобразовать электронную таблицу Excel, чтобы затем импортировать ее в другие программы. С нормальным XML-документом у меня нет проблем с этим, но XML-документ Excel - это другое дело. Там, где у меня проблема, вы извлекаете нужные мне данные из каждой ячейки.
Должно быть какое-то заклинание, о котором я не знаю, это позволит мне пройти дерево, чтобы получить данные. Вот что часть моей таблицы стилей выглядит следующим образом:Использование 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> 

(Original ответ Оставляя это в случае, если он по-прежнему полезно для понимания.).

В Data элементы не приставкой:

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

Но ваши селекторы префиксны их ss

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

Это не сработает, если пространство имен по умолчанию также имеет тот же URI, что и префикс ss.

Попробуйте переписывания селектора в

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

Это не то, что я хочу делать. Если я изменю таблицу стилей в представленном примере, я получаю список – Sleepy

+0

. Это не работает. Я перехожу к предложенной таблице стилей, и я получаю Reload, а затем весь текст, затем Jesse. Я не думаю, что каждая ячейка - это то, что мне нужно сделать. Я хочу прочитать элемент строки, а затем прочитать каждую ячейку для данных, которые она хранит. – Sleepy

+0

Хорошо, я взял ваш пример и достал XSL : Для каждого для ячеек, а затем просто используются скобки для ячеек .ie ss: Cell [1], и он предоставляет мне данные, которые я ищу.Я думаю, что переход на уровень DATA был слишком глубоким для индексирования, но, конечно же, я не являюсь гуру XPATH любыми средствами. – Sleepy

Смежные вопросы