Можно ли получить имена атрибутов, соответствующие определенному условию, с помощью xpath1.0?

#xml #xpath #xquery

Вопрос:

 <Tasks>
 <Task>
  <UID>14</UID>
  <Name>Entertainment</Name>
  <ID>2</ID>
  <PerComp>22</PerComp>
 </Task>
 <Task>
  <UID>12</UID>
  <Name>Movie</Name>
  <ID>1</ID>
  <PerComp>55</PerComp>
 </Task>
 <Task>
  <UID>15</UID>
  <Name>Star</Name>
  <ID>3</ID>
  <PerComp>100</PerComp>
 </Task>
</Tasks>
    
 

Можно ли перечислить все имена задач в разделителе через запятую из приведенного выше XML с условием PerComp, не равным 100? Там может быть 100 задач, и мне нужны все имена задач?

Ожидаемый результат:

 Entertainment, Movie, etc.
 

Комментарии:

1. Вы добавили тег xquery, так почему же вы ограничиваете ответ xpath 1.0 в названии? Если вы можете использовать xpath 2.0 , я восстановлю свой ответ.

2. Инструмент, который я использую, поддерживает только xpath1.0. В качестве альтернативы я планирую импортировать xml в sql и попробовать сделать запрос. Поэтому я ищу возможный вариант либо xpath, либо xquery

Ответ №1:

XPath 1.0 позволяет извлекать набор узлов (которые являются элементами, а не атрибутами — ваш XML не содержит атрибутов), но он не позволяет объединять их значения в строку; это должно быть сделано вызывающим приложением.

 //Task[not(PerComp = 100)]/Name
 

Комментарии:

1. //Задача[не(PerComp = ‘100’)]/Имя сработало для меня. Спасибо, Майкл.

2. Можно ли также получить оставшиеся узлы, если имя элемента соответствует определенному условию? В приведенном выше примере, если имя элемента совпадает с фильмом, я хочу, чтобы все узлы были ниже этого узла?

3. XPath возвращает ссылки на узлы в исходном документе. Если вы выберете узел, к нему по-прежнему будут подключены все его родительские, дочерние и дочерние узлы, поэтому они также доступны для вашего приложения. Вы можете либо перейти к этим узлам с помощью API, такого как DOM или JDOM, либо выполнить дополнительные выражения XPath, чтобы добраться до них.

4. <Задача> <Задача><UID>14<UID></UID> </UID><Имя>Развлечения<Имя></Имя> </Имя><ИДЕНТИФИКАТОР>2<ИДЕНТИФИКАТОР></ИДЕНТИФИКАТОР> </ИДЕНТИФИКАТОР><PerComp>22<PerComp></PerComp> </PerComp></Задача>. Как я могу отфильтровать только это значение по условию UID?? Скажем, как /Задачи/Задача[@UID=’14’]. Есть ли у нас такой вариант?

5. Пожалуйста, не задавайте дополнительных вопросов в комментариях к ответу. Задайте новый вопрос.