powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSL Как переставить данные в таблице для Excel
11 сообщений из 11, страница 1 из 1
XSL Как переставить данные в таблице для Excel
    #35426622
Mikhail S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени всем.
Исходный 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
XSL Как переставить данные в таблице для Excel
    #35426680
Volder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
XSL Как переставить данные в таблице для Excel
    #35427015
Mikhail S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Volder,

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

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

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

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

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

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

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

Михаил.

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

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

Всего хорошего.
Михаил.
...
Рейтинг: 0 / 0
XSL Как переставить данные в таблице для Excel
    #35429749
Mikhail S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже, что, для экспорта в файл для 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
XSL Как переставить данные в таблице для Excel
    #35431144
Volder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
XSL Как переставить данные в таблице для Excel
    #35432413
Mikhail S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По неизвестной причине к предыдущему сообщению выделенный файл не приложился.
Приношу извинения.

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

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


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