Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как добавить внешний xml-файл в ноду основного XML-файла при XSLT? / 6 сообщений из 6, страница 1 из 1
27.11.2015, 10:33
    #39114658
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить внешний xml-файл в ноду основного XML-файла при XSLT?
У меня есть XML-файл, в который внесены различные устройства.
У XML-файла примерно такая структура:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Data>
  <References>
    ...
    <Devices>
      <Device ... />
      ...
    </Devices>
    <DeviceTree>
      ...
    </DeviceTree>
  </References>
</Data>



/Data/References/Devices/Device — это список.
/Data/References/DeviceTree — это иерархическое дерево из Device произвольной вложенности, выглядит примерно так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    <DeviceTree>
      <DeviceItem name="device1">
        <PortItem name="1">
          <DeviceItem name="device1-1">
            <PortItem name="1"/>
            ...
          </DeviceItem>
          ...
        </PortItem>
        <PortItem name="2">
          <DeviceItem name="device2-1">
            <PortItem name="1"/>
            ...
          </DeviceItem>
          ...
        </PortItem>
        ...
      </DeviceItem>
      ...
    </DeviceTree>



Этот XML преобразуется с помощью файла XSL, используется процессор SAXON9 (в XSL используются словари и подключаются внешние файлы).

Еще у меня будет отдельный XML-файл со списком дополнительных устройств.
И мне его нужно вывести в одном определенном месте дерева (к примеру в /Data/References/DeviceTree/DeviceItem[@name='list']/PortItem[@name='special']).

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

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
27.11.2015, 20:38
    #39115240
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить внешний xml-файл в ноду основного XML-файла при XSLT?
Alibek B.Можно ли подключись внешний XML-файл прямо внутрь дерева?
Код: xml
1.
<xi:include href="other.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>


Alibek B.процессор SAXON9Вроде, поддерживает
...
Рейтинг: 0 / 0
27.11.2015, 20:58
    #39115248
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить внешний xml-файл в ноду основного XML-файла при XSLT?
Еще есть функция document()
...
Рейтинг: 0 / 0
28.11.2015, 00:22
    #39115279
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить внешний xml-файл в ноду основного XML-файла при XSLT?
А примером не поможете?
Во внешнем файле нужный список находится в /Data/References/Devices/Device.
Этот список мне нужно "вставить" в /Data/References/Devices/Device как есть (со всеми атрибутами). И в /Data/References/DeviceTree/DeviceItem[@name='list']/PortItem[@name='special'] (как DeviceItem с атрибутом @name).

Просто xi:include вставит документ с сохранением структуры, то есть получится /Data/References/Devices/Device/Data/References/Devices/Device.

Функция document на первый взгляд проще, но я не пойму, что с ней делать дальше.
Мне нужно со вставленным файлом работать как с основным, то есть нужно слияние данных.

Вот фрагмент XSL-файла:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<xsl:variable name="ref" select="document('netdata.xml')"/>
<xsl:variable name="data" select="document('netview.xml')"/>
<xsl:key name="device" match="/Data/References/Devices/Device" use="@name"/>
<xsl:key name="state"  match="/Data/References/States/State" use="@code"/>
<xsl:key name="query"  match="/Data/Result/DeviceList/DeviceQuery" use="@device"/>
<xsl:key name="value"  match="/Data/Result/ResultValues/ResultValue" use="@field"/>
...
<xsl:if test="count(//DeviceQuery[key('state',@state,$ref)/@class='alarm' and not(key('device',@device,$ref)/@type)])>0">, Аварии (<xsl:value-of select="count(//DeviceQuery[key('state',@state,$ref)/@class='alarm' and not(key('device',@device,$ref)/@type)])"/>)</xsl:if>


Мне нужно, чтобы key('device',@device,$ref) мог работать с добавленными данными из файла netextra.xml.
...
Рейтинг: 0 / 0
28.11.2015, 10:53
    #39115303
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить внешний xml-файл в ноду основного XML-файла при XSLT?
Поясню, в чем я вижу сложность с document.

Допустим я делаю так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<xsl:variable name="ref" select="document('netdata.xml')"/>
<xsl:variable name="extra" select="document('netextra.xml')"/>
<xsl:variable name="data" select="document('netview.xml')"/>
<xsl:key name="device" match="/Data/References/Devices/Device" use="@name"/>
<xsl:key name="state"  match="/Data/References/States/State" use="@code"/>
<xsl:key name="query"  match="/Data/Result/DeviceList/DeviceQuery" use="@device"/>
<xsl:key name="value"  match="/Data/Result/ResultValues/ResultValue" use="@field"/>



Затем в документе используются ссылки на справочник устройств.
Получается, что мне нужно делать так:
Код: xml
1.
2.
3.
<xsl:if test="(count(//DeviceQuery[key('state',@state,$ref)/@class='alarm' and not(key('device',@device,$ref)/@type)]) + count(//DeviceQuery[key('state',@state,$extra)/@class='alarm' and not(key('device',@device,$extra)/@type)]))>0">
Аварий: <xsl:value-of select="count(//DeviceQuery[key('state',@state,$ref)/@class='alarm' and not(key('device',@device,$ref)/@type)]) + count(//DeviceQuery[key('state',@state,$extra)/@class='alarm' and not(key('device',@device,$extra)/@type)])"/>)
</xsl:if>


Но таким образом шаблон сильно усложняется и становится громоздким.
Я бы хотел просто добавить содержимое внешнего файла к существующей ноде (а вернее не добавить, а слить две ноды из двух файлов).

Пока что я это делаю физически — из скрипта открываю netdata.xml, открываю netextra.xml, в цикле перебираю узлы из netextra.xml и добавляю их в /Data/References/Devices/Device и /Data/References/DeviceTree файла netdata.xml, после чего сохраняю результат во временный файл netmerge.xml, и в XSL использую этот временный файл.
Но хотелось бы обойтись без временных файлов и скрипта предобработки.
...
Рейтинг: 0 / 0
28.11.2015, 18:53
    #39115404
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как добавить внешний xml-файл в ноду основного XML-файла при XSLT?
Я пас. Не охота лезть в дебри чужого XSLT.
Когда я подключал XML, я делал структуру с учетом этого. Подключаемое получалось в отдельной ветви.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как добавить внешний xml-файл в ноду основного XML-файла при XSLT? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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