powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Найти все места где есть нужный нод
9 сообщений из 9, страница 1 из 1
Найти все места где есть нужный нод
    #39171810
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет. Помогите пожалуйста.
Пытаюсь написать Xpath запрос, который бы возвращал список нод, внутри которых есть нужный мне:

Код: c#
1.
xmlDoc.SelectNodes("ancestor:://Cabinet/Tool")


Но получаю ошибку "Результатом выражения должен быть NodeSet."

Подозреваю, что ошибка специфична для C#, т.к. яндексинг по тексту ошибки почти ничего не дал.

Но также подозреваю, что дело в не верно составленном Xpath.

Исходный документ

Код: 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.
<Doc>
  <Workers>...</Workers>

<Places>
  <Place1>
    <Cabinet>
      <Id>1</ID>      
      <Tool>...</Tool>
    </Cabinet>
  </Place1>

  <Place2>
    <Cabinet>
      <Id>2</ID>      
      <Tool>...</Tool>
    </Cabinet>
  </Place2>

  <Place3>
    <Cabinet>
      <Id>3</ID>      
    </Cabinet>
  </Place3>

</Places>
</Doc>



Соответственно нужно чтобы запрос вернул Place1 и Place2.
...
Рейтинг: 0 / 0
Найти все места где есть нужный нод
    #39171840
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

Код: 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.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsl.xsl"?>
<Doc>
  <Workers>...</Workers>

<Places>
  <Place1>
    <Cabinet>
      <Id>1</Id>      
      <Tool>2</Tool>
    </Cabinet>
  </Place1>

  <Place2>
    <Cabinet>
      <Id>2</Id>      
      <Tool>2</Tool>
    </Cabinet>
  </Place2>

  <Place3>
    <Cabinet>
      <Id>3</Id>
    </Cabinet>
  </Place3>
  <Place2>
    <Cabinet>
      <Id>2</Id>      
      <Tool>2</Tool>
    </Cabinet>
  </Place2>
  <Place3>
    <Cabinet>
      <Id>3</Id>
    </Cabinet>
  </Place3>
</Places>
</Doc>


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
<root>
<xsl:copy-of select="//Places/child::*[Cabinet/Tool]"/>
</root>
  </xsl:template>
</xsl:stylesheet>


я использовал xsl для проверки xpath, не уверен что понял задачу, но это путь возвращает узлы Place в которых есть Tool
Сам XML был не валидным расхождения в названии узла id , я подправил на свое усмотрение
...
Рейтинг: 0 / 0
Найти все места где есть нужный нод
    #39171859
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или так
Код: xml
1.
<xsl:copy-of select="//Tool/ancestor::node()[2]" />
...
Рейтинг: 0 / 0
Найти все места где есть нужный нод
    #39172140
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фридрих,

Извините. Запрос работает, но похоже я ошибся.
Мне нужно чтобы возвращался набор тэгов с именем "Places" (на данном примере XML он только 1 конечно). На том же уровне находится и тэг Workers - он не должен попасть. Только тэг "Places".

Не могу понять как нужно переписать "//Places/child::*[Cabinet/Tool]" - никогда не приходилось с Осями работать.
Помогите пожалуйста.

Для меня проще в программе написать //Places//Tool и затем просто в коде вызвать node.parent.parent. Но это не красиво конечно же. Вот и хотелось найти более красивый способ.
...
Рейтинг: 0 / 0
Найти все места где есть нужный нод
    #39172194
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,

можно и так попробывать:
Код: xml
1.
"//Tool/ancestor::node()[3]"



вообще, желательно написать то, что должно быть на выходе.
...
Рейтинг: 0 / 0
Найти все места где есть нужный нод
    #39172414
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фридрих,

Спасибо, собственно "//Tool/ancestor::node()[3]" полностью подошло :) Как просто оказалось.

Я раньше такой синтаксис не использовал.
...
Рейтинг: 0 / 0
Найти все места где есть нужный нод
    #39172430
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фридрих,

Подскажите пожалуйста еще. Есть ли какой-то задачник по Xpath ?
В обычной практике с осями дел не имею, а смотрю они очень полезны. Хотелось бы попрактиковаться.

Сам себе я задачи придумать не смогу. Очевидно не зная тонкостей осей, не смогу придумать задачи, которые решаются именно через оси.
...
Рейтинг: 0 / 0
Найти все места где есть нужный нод
    #39172517
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Найти все места где есть нужный нод
    #39172554
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фридрих,

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


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