powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Товарищи, подскажите как Query составить. :)
10 сообщений из 10, страница 1 из 1
Товарищи, подскажите как Query составить. :)
    #33842421
Nowhere_None
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ломаю голову уже полчаса - никак не могу найти приемлемый вариант..

Есть у меня XML-ка примерно такой структуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<data>
  <row id="400" num="0">
    <field id="1"> 400 </field>
    <field id="2"> 26 </field>
     ....
    <field id="21"> 2 </field>
    <field id="22"> 1 </field>
  </row>
   .......
  <row id="20001" num="0">
    <field id="1"> 20001 </field>
    <field id="2"> 26 </field>
     ....
    <field id="21"> 400 </field>
    <field id="22"> 1 </field>
  </row>
</data>
Мне нужно каким-то образом сделать XPath-запрос, который бы возвращал мне значение field c id ='1', если он находится внутри row который содежит
field c id ='21' и значением '400' (все цифры взяты из головы).

Я смог начертать нечто похожее:

\/\/row[*/@id='21' and */text()='400']/field[@id='1']

Но этот запрос возвращает мне field[@id='1'] у row где любой field имеет значение '400'... :(

Буду рад любому совету. :) Заранее - спасибо. :)
...
Рейтинг: 0 / 0
Товарищи, подскажите как Query составить. :)
    #33842484
Nowhere_None
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, еще могу добавить, что row@id и field[@id='1']text() всегда одинаковые.. :)
...
Рейтинг: 0 / 0
Товарищи, подскажите как Query составить. :)
    #33842960
beard-electronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
/data/row/field[@id= 1  and parent::row/field[@id= 21  and .= 400 ]]
...
Рейтинг: 0 / 0
Товарищи, подскажите как Query составить. :)
    #33842995
beard-electronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nowhere_NoneДа, еще могу добавить, что row@id и field[@id='1']text() всегда одинаковые.. :)
Ну а в таком случае можно написать
Код: plaintext
1.
/data/row[field[@id= 21  and .= 400 ]]/@id
соответственно - быстрее должно быть :)
...
Рейтинг: 0 / 0
Товарищи, подскажите как Query составить. :)
    #33845802
Nowhere_None
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
/data/row[field[@id= 21  and .= 400 ]]/@id

Гррр. :) Чую, что запрос совершенно правильный, но почему-то MSXML мне возвращает пустой обьект.. %(
...
Рейтинг: 0 / 0
Товарищи, подскажите как Query составить. :)
    #33846072
Nowhere_None
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уффф.. Методом проб и ошибок нашел правильный вариант:

Код: plaintext
1.
"\/\/row[field[@id='14' and text()='302']]/@id"

beard-electronic : Спасибо за подсказку! :)
...
Рейтинг: 0 / 0
Товарищи, подскажите как Query составить. :)
    #33846369
beard-electronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nowhere_NoneЧую, что запрос совершенно правильный, но почему-то MSXML мне возвращает пустой обьект.. %(
Странно - я протестил как раз MSXML 4.0...
Тем более никаких отличий нет, за исключением заэскейпенных слешов (ну это
от строкового типа языка зависит)... Ведь трансформатор должен приводить к
числу, если оно есть в предикате, хотя можно написать и явно
Код: plaintext
1.
number(@id)= 400 
...
Рейтинг: 0 / 0
Товарищи, подскажите как Query составить. :)
    #33848104
Nowhere_None
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще странная ситуация, согласен :)
Я попробовал еще, но суть в том, что не работает с "/data".
Я обращаюсь к XML c помощью JavaScript из IE 6.0 и FF 1.5. IE парсит XML с помощью MSXML, а FF - сам.

Нашел вариант который работает в обоих браузерах (эскейпы убрал):
"//row[field[@id='14' and .='302']]/field[@id='1']"

Интересно что такое обращение:
"//row[field[14] and .='302']]/field[@id='1']"
работает только в FF.
...
Рейтинг: 0 / 0
Товарищи, подскажите как Query составить. :)
    #33848615
beard-electronic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/data - имется ввиду, что data - корневой элемент - я так решил исходя из
вашего примера. Если это не так, то сработать и не должно.
выражение //row выбирает элементы row, являющийся потомками корня документа.
А
//row[field[@id='14' and .='302']]/field[@id='1']
не есть тоже самое что
//row[field[14] and .='302']]/field[@id='1']
В первом случае выбирается элемент field c атрибутом id равным 1, являющийся
непосредственным потомком элемента row, который имеет сына field с id = 14 и
значением 302.
Во втором случае выбирается элемент field c атрибутом id равным 1, являющийся
непосредственным потомком элемента row, у которого занчение - 302 и есть не менее 14 сыновей field (filed[14] - четырнадцатый элемент field).
Так как по всей видимости у вас всегда field/@id в row идет по порядку начиная с
1-цы, то в предикате field[@id='14'] эквивалентно field[14], но
[field[@id='14' and .='302']] не эквивалентно [field[14] and .='302']], так как
в первом случае . - узел с field, а во втором - узел с row...
А что значит работает только в FF?
Выдает правильный результат?
...
Рейтинг: 0 / 0
Товарищи, подскажите как Query составить. :)
    #33854910
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
text()='302'
string(.)='302'
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Товарищи, подскажите как Query составить. :)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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