Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите составить запрос для XPath / 3 сообщений из 3, страница 1 из 1
19.09.2012, 16:29
    #37964388
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос для XPath
У меня есть примерно такой XML, содержащий коллекцию-справочник Devices и дерево произвольной вложенности DeviceTree:
Код: xml
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
<Data>
  <References>
    <Devices>
      <Device name="dev1" description="123" address="abc"/>
      <Device name="dev2" description="123" address="abc"/>
      <Device name="dev3" description="123" address="abc"/>
      <Device name="item1" description="123" address="abc"/>
      <Device name="item2" description="123" address="abc"/>
      <Device name="item3" description="123" address="abc"/>
      <Device name="item4" description="123" address="abc"/>
      <Device name="item5" description="123" address="abc"/>
      ...
    </Devices>
  </References>
  <DeviceTree>
    <DeviceItem name="dev1">
      <PortItem name="1" description="info1-1">
        <DeviceItem name="item1"/>
      </PortItem>
      <PortItem name="2" description="info1-2">
        <DeviceItem name="item2"/>
        <DeviceItem name="item3"/>
      </PortItem>
      <PortItem name="3" description="info1-3">
      </PortItem>
    </DeviceItem>
    <DeviceItem name="dev2">
      <PortItem name="1" description="info2-1">
        <DeviceItem name="item4"/>
        <DeviceItem name="item5">
          <PortItem name="1" description="subinfo5-1">
            <DeviceItem name="item6"/>
            <DeviceItem name="item7"/>
            <DeviceItem name="item8"/>
          </PortItem>
          <PortItem name="2" description="subinfo5-2"/>
          <PortItem name="3" description="subinfo5-3"/>
        <DeviceItem>
      </PortItem>
      <PortItem name="2" description="info2-2">
      </PortItem>
      <PortItem name="3" description="info2-3">
        <DeviceItem name="dev3">
          <PortItem name="1" description="info3-1">
            <DeviceItem name="item9"/>
          </PortItem>
          <PortItem name="2" description="info3-2">
          </PortItem>
          <PortItem name="3" description="info3-3">
          </PortItem>
        </DeviceItem>
      </PortItem>
    </DeviceItem>
  </DeviceTree>
</Data>



У меня есть список //DeviceItem, у которых имя соответствует маске "item*", элементы этого списка перебираются в цикле.
Мне нужно определить для каждого элемента списка, к какому родителькому элементу с именем "dev*" он принадлежит (item9 принадлежит dev3, item7 принадлежит dev2). Также мне нужно получить значение атрибута description для PortItem от dev-элемента.
Или другими словами, мне нужно получить следующую табличку:
itemdevportitem1dev1info1-1item2dev1info1-2item3dev1info1-2item4dev2info2-1item5dev2info2-1item6dev2info2-1item7dev2info2-1item8dev2info2-1item9dev3info3-1

Обработка выполняется первовым скриптом, примерно таким образом:
Код: php
1.
my $node = $xml->find('//DeviceItem[@name=\'$key\']');


Подскажите, как мне из этого выражения получить нужные данные?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
19.09.2012, 18:35
    #37964574
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос для XPath
Сделал так:
Код: php
1.
2.
3.
  my $d = $xml->find("//DeviceItem[\@name='$key']/ancestor::DeviceItem[starts-with(\@name,'CORE-')][1]/\@name");
  my $p = $xml->find("//DeviceItem[\@name='$key']/ancestor::PortItem[ancestor::DeviceItem[starts-with(\@name,'CORE-')][1]][1]/\@name");
  my $v = $xml->find("//DeviceItem[\@name='$key']/ancestor::PortItem[ancestor::DeviceItem[starts-with(\@name,'CORE-')][1]][1]/\@description");


Наверное можно было придумать что-то лучше, но мне подошло.
...
Рейтинг: 0 / 0
20.09.2012, 14:07
    #37965697
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить запрос для XPath
Более правильный запрос:
Код: php
1.
2.
3.
  my $d = $xml->find("//DeviceItem[starts-with(\@name,'CORE-') and .//DeviceItem[\@name='$key'] and not(.//DeviceItem[starts-with(\@name,'CORE-')])]/\@name");
  my $p = $xml->find("//PortItem[parent::DeviceItem[starts-with(\@name,'CORE-')] and not(.//DeviceItem[starts-with(\@name,'CORE-')]) and .//DeviceItem[\@name='$key']]/\@name");
  my $v = $xml->find("//PortItem[parent::DeviceItem[starts-with(\@name,'CORE-')] and not(.//DeviceItem[starts-with(\@name,'CORE-')]) and .//DeviceItem[\@name='$key']]/\@description");
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите составить запрос для XPath / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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