powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Доступ к вложенным узлам
8 сообщений из 8, страница 1 из 1
Доступ к вложенным узлам
    #34334952
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XML-фрагмент которого приведён ниже, требуется преобразовать в текстовый файл
с разделителями.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<Файл>
<ПачкаВходящихДокументов>
<ПОРУЧЕНИЕ>
<НомерВпачке> 3 </НомерВпачке> 
<НомерВмассиве> 00002 </НомерВмассиве>
<ФИО>
  <Фамилия>Иванов</Фамилия> 
  <Имя>Иван</Имя> 
  <Отчество>Иванович</Отчество> 
</ФИО>
</ПОРУЧЕНИЕ>
<ПОРУЧЕНИЕ>
 ...
</ПОРУЧЕНИЕ>
 ...
</ПачкаВходящихДокументов>
</Файл>

Я получил текстовые значения заключенные в теги <НомерВпачке> и <НомерВмассиве>.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" encoding="Windows-1251" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <xsl:for-each select="Файл/ПачкаВходящихДокументов/ПОРУЧЕНИЕ">
       <xsl:value-of select="НомерВпачке"/>,
       <xsl:value-of select="НомерВмассиве"/>,
    </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

А вот с тегами вложенными в <ФИО> возникли затруднения.
По идее, нужно в цикл по дочерним узлам тега <ПОРУЧЕНИЕ> вложить
такой цикл
Код: plaintext
1.
2.
3.
4.
5.
<xsl:for-each select="Файл/ПачкаВходящихДокументов/ПОРУЧЕНИЕ/ФИО">
    <xsl:for-each select="Файл/ПачкаВходящихДокументов/ПОРУЧЕНИЕ">
    <xsl:value-of select="Фамилия"/>,
    <xsl:value-of select="Имя"/>,
    <xsl:value-of select="Отчество"/>, 
</xsl:for-each
>
Но это ничего не дало.
Дальше в документе встречаются теги с гораздо более глубоким уровнем вложенности,
так что хочется понять принцип.
...
Рейтинг: 0 / 0
Доступ к вложенным узлам
    #34335533
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильно что не сработало, тови теги Фамилия, Имя , Отчество находятся в теге ФИО, а цикл у тебя по какому тегу?
Вот такого достаточно:
<xsl:for-each select="Файл/ПачкаВходящихДокументов/ПОРУЧЕНИЕ/ФИО">
<xsl:value-of select="Фамилия"/>,
<xsl:value-of select="Имя"/>,
<xsl:value-of select="Отчество"/>,
</xsl:for-each>
Общий принцип:
Пиши выборку конкретного значения в отдельный шаблон, в пути укажи путь:
xml:
<Файл>
<ПачкаВходящихДокументов>
<ПОРУЧЕНИЕ>
<НомерВпачке>3</НомерВпачке>
<НомерВмассиве>00002</НомерВмассиве>
<ФИО>
<Фамилия>Иванов</Фамилия>
<Имя>Иван</Имя>
<Отчество>Иванович</Отчество>
</ФИО>
</ПОРУЧЕНИЕ>
<ПОРУЧЕНИЕ>
<ФИО>
<Фамилия>Петров</Фамилия>
<Имя>Петр</Имя>
<Отчество>Петрович</Отчество>
</ФИО>
</ПОРУЧЕНИЕ>
</ПачкаВходящихДокументов>
</Файл>

xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:sch="http://www.ascc.net/xml/schematron">

<xsl:template match="/">
<xsl:for-each select="Файл/ПачкаВходящихДокументов/ПОРУЧЕНИЕ">
НомерВпачке = <xsl:value-of select="НомерВпачке"/>,
НомерВмассиве = <xsl:value-of select="НомерВмассиве"/>,
</xsl:for-each>
<xsl:apply-templates select="//ПОРУЧЕНИЕ/ФИО"/>

</xsl:template>
<xsl:template match="//ПОРУЧЕНИЕ/ФИО">
<xsl:value-of select="Фамилия"/>,
<xsl:value-of select="Имя"/>,
<xsl:value-of select="Отчество"/>,
</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
Доступ к вложенным узлам
    #34335552
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuSa
Общий принцип:
Пиши выборку конкретного значения в отдельный шаблон, в пути укажи путь:

Сори :) ляпнул некрасиво. В смысле в вызови шаблон по обработке конкретного узла, а в аттрибут match передай место где искать. Запись типа : "//ПОРУЧЕНИЕ/ФИО" - обозначает, что тег (нод) ФИО находится в теге ПОРУЧЕНИЕ, который в свою очередь лежит фиг знает еще в чем.
...
Рейтинг: 0 / 0
Доступ к вложенным узлам
    #34335789
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Есть ещё такая проблема: формат выходного файла получается не тот, что мне нужен.
Дело в том, что тег ПОРУЧЕНИЕ повторяется в документе много раз и значения всех тегов вложенных в поручение должны быть записаны в одну строку. Получается же так - первый шаблон выводит НомерВПачке и НомерВМассиве из всех ПОРУЧЕНИЙ, затем второй шаблон также выводит все фио подряд.
Получается так
1,2133, 2,34324,Иванов,Иван,Иванович,Петров,Петр,Петрович

Должно быть так
1,2133,Иванов,Иван,Иванович
2,34324,,Петров,Петр,Петрович
...
Рейтинг: 0 / 0
Доступ к вложенным узлам
    #34336244
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну ёперный театр, надо в одном месте, так и пиши в одном месте.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="Windows-1251" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <xsl:for-each select="Файл/ПачкаВходящихДокументов/ПОРУЧЕНИЕ">
       <xsl:value-of select="НомерВпачке"/>,
       <xsl:value-of select="НомерВмассиве"/>,
       <xsl:for-each select="ФИО">
        <xsl:value-of select="Фамилия"/>,
        <xsl:value-of select="Имя"/>,
        <xsl:value-of select="Отчество"/>, 
       </xsl:for-each>
    </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
Доступ к вложенным узлам
    #34336912
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну да.
Ну и последнее. Когда я ставлю запятую после <xsl:value-of select="что-то там"/>,
то в выходном файле каждое значение начинает выводиться с новой строки.
Если все <xsl:value-of select записать в одну строчку, то и в файл все пишется также.
Как я понимаю, надо как-то указать XSLT-процессору, что пробельные символы которые есть в xsl нужно игнорировать.
Но при этом вывод каждой новой итерации цикла
<xsl:for-each select="ФайлПФР/ПачкаВходящихДокументов/ПОРУЧЕНИЕ_НА_ДОСТАВКУ_ПЕНСИЙ">
должен начинаться с новой строки.
То есть не так
2,
00001,
Иванов,
Иван,
Иванович,
3,
00002,
Петров,
Петр,
Петрович,
а так
2,00001,Иванов,Иван,Иванович,
3,00002,Петров,Петр,Петрович,
...
Рейтинг: 0 / 0
Доступ к вложенным узлам
    #34337048
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<xsl:value-of select="что-то там"/><xsl:text>, </xsl:text>
...
Рейтинг: 0 / 0
Доступ к вложенным узлам
    #34339520
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дальше уже само пошло :-)
Спасибо, с вашей помощью начинаю что-то соображать.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Доступ к вложенным узлам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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