Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSL Как переставить данные в таблице для Excel / 11 сообщений из 11, страница 1 из 1
12.07.2008, 06:33
    #35426622
Mikhail S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
Доброго времени всем.
Исходный XML имеет простой формат:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<?xml version="1.0" encoding="utf-8"?>
<DataSet>
  <Table1>
    <Row>
      <TestName>InitialTest</TestName>
      <TestDate> 2008 - 07 - 11 </TestDate>
      <TestTime> 14 : 36 : 48 </TestTime>
      <BoardNumber> 6 </BoardNumber>
      <ChipNumber> 1 </ChipNumber>
      <Current> 20 </Current>
      <Voltage> 5 . 6 </Voltage>
    </Row>
    <Row>
      <ChipNumber> 2 </ChipNumber>
      <Current> 21 </Current>
      <Voltage> 5 . 8 </Voltage>
    </Row>
    <Row>
      <ChipNumber> 3 </ChipNumber>
      <Current> 19 </Current>
      <Voltage> 5 . 3 </Voltage>
    </Row>
    <Row>
      <ChipNumber> 4 </ChipNumber>
      <Current> 20 </Current>
      <Voltage> 5 . 4 </Voltage>
    </Row>
    <Row>
      <ChipNumber> 5 </ChipNumber>
      <Current> 22 </Current>
      <Voltage> 5 . 2 </Voltage>
    </Row>
  </Table1>
</DataSet>


Первые 4 данных (Наименование теста, дата, время и номер платы) являются общими для всей таблицы. Поэтому, при выводе таблицы в Excel разумно сэкономить место и вывести эти 4 данных все в первой колонке. Тоесть выходной файл должен быть такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<?xml version="1.0" encoding="utf-8"?>
<DataSet>
  <Table1>
    <Row>
      <TestName>InitialTest</TestName>
      <ChipNumber> 1 </ChipNumber>
      <Current> 20 </Current>
      <Voltage> 5 . 6 </Voltage>
    </Row>
    <Row>
      <TestDate> 2008 - 07 - 11 </TestDate>
      <ChipNumber> 2 </ChipNumber>
      <Current> 21 </Current>
      <Voltage> 5 . 8 </Voltage>
    </Row>
    <Row>
      <TestTime> 14 : 36 : 48 </TestTime>
      <ChipNumber> 3 </ChipNumber>
      <Current> 19 </Current>
      <Voltage> 5 . 3 </Voltage>
    </Row>
    <Row>
      <BoardNumber> 6 </BoardNumber>
      <ChipNumber> 4 </ChipNumber>
      <Current> 20 </Current>
      <Voltage> 5 . 4 </Voltage>
    </Row>
    <Row>
      <ChipNumber> 5 </ChipNumber>
      <Current> 22 </Current>
      <Voltage> 5 . 2 </Voltage>
    </Row>
  </Table1>
</DataSet>


Подскажите, как это проще сделать.
Заранее благодарен.
Михаил.
...
Рейтинг: 0 / 0
12.07.2008, 11:36
    #35426680
Volder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/DataSet/Table1">
      <DataSet>
         <Table1>
            <xsl:apply-templates select="Row"/>
         </Table1>
      </DataSet>
   </xsl:template>
   <xsl:template match="Row">
      <xsl:copy-of select="."/>
   </xsl:template>
   <xsl:template match="Row[position() < 5]">
      <xsl:variable name="num" select="position()"/>
      <Row>
         <xsl:copy-of select="/DataSet/Table1/Row[1]/child::*[$num]"/>
         <xsl:choose>
            <xsl:when test="$num=1">
               <xsl:copy-of select="child::*[position()>4]"/>
            </xsl:when>
            <xsl:otherwise>
               <xsl:copy-of select="child::*"/>
            </xsl:otherwise>
         </xsl:choose>
      </Row>
   </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
12.07.2008, 23:50
    #35427015
Mikhail S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
Спасибо Volder,

но "Microsoft Visual Studio 2005" жалуется на строку
<xsl:template match="Row[position() < 5]">
Ему не нравится знак "<"

Кажется, где-то в форуме я уже видел подобное. Нужно этот знак заменить на что-то другое.

Еще раз спасибо.

Михаил
...
Рейтинг: 0 / 0
13.07.2008, 00:48
    #35427030
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
& lt; (без пробела)

С уважением, Vasilisk
...
Рейтинг: 0 / 0
13.07.2008, 07:42
    #35427068
Mikhail S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
Vasilisk,

пробовал подставить вместо ">5" "& lt 5" (без пробела между & и lt), но это не сработало. Visual Studio 2005 продолжает жаловаться и говорит, что ожидает там ";".

Наличие пробелов до или после "& lt" (без пробела) не влияет.
Получается, что Visual Studio не может понять условие в индексе строки.

Михаил.

P.S. Кстати, & lt (без пробела) заменяется знаком < (меньше). А мне нужен там знак > (больше).
...
Рейтинг: 0 / 0
13.07.2008, 09:57
    #35427087
Volder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
пардон, это видать на форуме здесь автоматом перевелось в знак '<' и '>', у меня были entities:
< заменить на & l t ;
> заменить на & g t ;

пробелы убрать
...
Рейтинг: 0 / 0
13.07.2008, 16:13
    #35427227
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
Mikhailпробовал подставить вместо ">5" "& lt 5" (без пробела между & и lt), но это не сработало. Visual Studio 2005 продолжает жаловаться и говорит, что ожидает там ";".
Правильно. Будьте внимательны
& lt ;
MikhailP.S. Кстати, & lt (без пробела) заменяется знаком < (меньше). А мне нужен там знак > (больше).
& gt ;
...
Рейтинг: 0 / 0
14.07.2008, 00:43
    #35427454
Mikhail S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
Да, подставляя & lt; (без пробела) все работает как надо.
Большое спасибо Volder.
Большое спасибо Vasilisk.
На самом деле мой исходный XML сложнее (Больше номер чипов и несколько серий измерений с разной датой, временем и названием, больше число данных теста и т.д.). Выходной файл тоже отличается (вывожу заголовки), но спасибо за идею. Буду раскручивать ее для реального входного файла.
Понял, что надо почитать про шаблоны в XML.

Всего хорошего.
Михаил.
...
Рейтинг: 0 / 0
14.07.2008, 21:45
    #35429749
Mikhail S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
Похоже, что, для экспорта в файл для Excel элемент xsl:copy-of использовать затруднительно. Если результат селекции - набор узлов, то все узлы копируются. А для Excel надо изменять формат, чтобы привести к виду например такому:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
      
<Row>
  <Cell> <Data ss:Type="String">InitialTest</Data> </Cell>
  <Cell> <Data ss:Type="Number"> 1 </Data> </Cell>
  <Cell> <Data ss:Type="Number"> 20 </Data> </Cell>
  <Cell> <Data ss:Type="Number"> 5 . 6 </Data> </Cell>
</Row>


В приложении 3 файла. Исходные данные, требуемый выходной файл и частично работающий xslt. Частично значит - он добавляет аттрибуты чтоб Excel узнавал файл как свой и начинает WorkSheet, Workbook и Table. Но сама перестановка данных в таблице не работает.
Заранее благодарен за совет.

Михаил
...
Рейтинг: 0 / 0
15.07.2008, 13:57
    #35431144
Volder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
Mikhail SПохоже, что, для экспорта в файл для Excel элемент xsl:copy-of использовать затруднительно.да, но можно прекрасно использовать <xsl:value-of> :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/DataSet/Table1">
      <DataSet>
         <Table1>
            <xsl:apply-templates select="Row"/>
         </Table1>
      </DataSet>
   </xsl:template>
   <xsl:template match="Row">
      <Row>
         <xsl:if test="position() > 4">
            <Cell>
               <Data/>
            </Cell>
         </xsl:if>
         <xsl:apply-templates select="*" mode="node"/>
      </Row>
   </xsl:template>
   <xsl:template match="Row[position() < 5]">
      <xsl:variable name="num" select="position()"/>
      <Row>
         <xsl:apply-templates select="/DataSet/Table1/Row[1]/child::*[$num]" mode="node"/>
         <xsl:choose>
            <xsl:when test="$num=1">
               <xsl:apply-templates select="child::*[position()>4]" mode="node"/>
            </xsl:when>
            <xsl:otherwise>
               <xsl:apply-templates select="child::*" mode="node"/>
            </xsl:otherwise>
         </xsl:choose>
      </Row>
   </xsl:template>
   <xsl:template match="node()" mode="node">
      <Cell>
         <Data>
            <xsl:value-of select="."/>
         </Data>
      </Cell>
   </xsl:template>
</xsl:stylesheet>
до своего документа - докрутите сами, как-то: добавить ss:type атрибут.
...
Рейтинг: 0 / 0
16.07.2008, 00:06
    #35432413
Mikhail S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSL Как переставить данные в таблице для Excel
По неизвестной причине к предыдущему сообщению выделенный файл не приложился.
Приношу извинения.

Volder, теперь все работает как надо!
Спасибо!

Михаил
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSL Как переставить данные в таблице для Excel / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]