XPath. Ссылка на атрибут узла внутри вложенного критерия
От: teleroot  
Дата: 12.12.12 12:22
Оценка:
Всем привет!

Никак не соображу, как решить следующую задачу, не используя for-each

Дано:
входящий XML
<rows>
  <row ID="1">
    <c ID="2"/>
    <c ID="123"/>
    <c ID="90"/>
  </row>
  <row ID="2">
    <c ID="2"/>
  </row>
  <row ID="123">
    <c ID="2"/>
    <c ID="90"/>
  </row>
</rows>

Необходимо выбрать все узлы "//c", которые встречаются во всех "//row". Идентификация по атрибуту @ID.
В данном случае решением должен быть узел <c ID="2"/>.

Есть ли какие-либо идеи на этот счет?
xpath xslt
Re: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: Аноним931 Германия  
Дата: 12.12.12 19:06
Оценка:
Здравствуйте, teleroot, Вы писали:

T>Необходимо выбрать все узлы "//c", которые встречаются во всех "//row". Идентификация по атрибуту @ID.

T>В данном случае решением должен быть узел <c ID="2"/>.

//row//c[@ID="2"]
"Больше 100кмч можно ехать на автобане в любом ряду кроме правого крайнего" (c) pik
"В германии земля в частной собственности" (c) pik
"Закрывать школы, при нулевой смертности среди детей и подростков, это верх глупости" (c) Abalak
Re[2]: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: teleroot  
Дата: 12.12.12 19:39
Оценка:
Здравствуйте, Аноним931, Вы писали:

А>Здравствуйте, teleroot, Вы писали:


T>>Необходимо выбрать все узлы "//c", которые встречаются во всех "//row". Идентификация по атрибуту @ID.

T>>В данном случае решением должен быть узел <c ID="2"/>.

А>//row//c[@ID="2"]


Спасибо за ответ, но, к сожалению, он не по теме.
Выражаясь языком реляций, входные данные можно представить так:
Есть сущности класса "row". Есть сущности класса "с". Между ними есть связь "N->N".
Вопрос: как получить подмножество сущностей класса "с", каждый элемент которого связан с каждым из элементов класса "row"
Re[3]: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: Аноним931 Германия  
Дата: 13.12.12 11:00
Оценка: -1
Здравствуйте, teleroot, Вы писали:

T>Спасибо за ответ, но, к сожалению, он не по теме.


Ответ был дан на поставленный вопрос. Значит, "не по теме" был вопрос, а не ответ.

T>Выражаясь языком реляций, входные данные можно представить так:

T>Есть сущности класса "row". Есть сущности класса "с". Между ними есть связь "N->N".
T>Вопрос: как получить подмножество сущностей класса "с", каждый элемент которого связан с каждым из элементов класса "row"

Будь добр, приведи пример выходной структуры.
"Больше 100кмч можно ехать на автобане в любом ряду кроме правого крайнего" (c) pik
"В германии земля в частной собственности" (c) pik
"Закрывать школы, при нулевой смертности среди детей и подростков, это верх глупости" (c) Abalak
Re[4]: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: Eugeny__ Украина  
Дата: 14.12.12 15:18
Оценка:
Здравствуйте, Аноним931, Вы писали:

А>Ответ был дан на поставленный вопрос. Значит, "не по теме" был вопрос, а не ответ.


Кстати, тоже была подобная задача.
Только с уточнением.
Если взять xml ниже и xpath "//row//c[@ID='2']", то как выбрать определенный элемент этого результата?

<rows>
  <row ID="1">
    <c ID="2">value1</c>
    <c ID="123"/>
    <c ID="90"/>
  </row>
  <row ID="2">
    <c ID="2">value2</c>
  </row>
  <row ID="123">
    <c ID="2">value3</c>
    <c ID="90"/>
  </row>
</rows>


Т.е. //row//c[@ID='2'] выбирает все элементы с ID=2, но если я попробую сделать //row//c[@ID='2'][1], //row//c[@ID='2'][2], //row//c[@ID='2'][3], то для первого случая я получу то же, что для изначального выражения, и пустой результат для остальных двух. А хотелось бы получить результаты "value1", "value2" и "value3" соответственно. Вот я так и не нашел, как такое можно замутить.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: PA  
Дата: 14.12.12 21:02
Оценка: 1 (1)
Здравствуйте, teleroot, Вы писали:


T>Необходимо выбрать все узлы "//c", которые встречаются во всех "//row". Идентификация по атрибуту @ID.

T>В данном случае решением должен быть узел <c ID="2"/>.

Например, так можно:
//row/c[count(//row[c/@ID = current()/@ID]) = count(//row)]
Re[5]: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: PA  
Дата: 14.12.12 21:41
Оценка: 4 (1)
Здравствуйте, Eugeny__, Вы писали:

E__>Здравствуйте, Аноним931, Вы писали:


А>>Ответ был дан на поставленный вопрос. Значит, "не по теме" был вопрос, а не ответ.


E__>Кстати, тоже была подобная задача.

E__>Только с уточнением.
E__>Если взять xml ниже и xpath "//row//c[@ID='2']", то как выбрать определенный элемент этого результата?

E__>Т.е. //row//c[@ID='2'] выбирает все элементы с ID=2, но если я попробую сделать //row//c[@ID='2'][1], //row//c[@ID='2'][2], //row//c[@ID='2'][3], то для первого случая я получу то же, что для изначального выражения, и пустой результат для остальных двух. А хотелось бы получить результаты "value1", "value2" и "value3" соответственно. Вот я так и не нашел, как такое можно замутить.


Классическая ошибка — //row//c[@ID='2'][2] — означает выбрать второй элемент "с" с указанным атрибутом, принадлежащий элементу "row".
Чтобы выбрать второй элемент в сформированной выборке, надо эту самую выборку обозначить, вот таким образом:
(//row//c[@ID='2'])[2]
Re: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: Lloyd Россия  
Дата: 03.05.13 23:01
Оценка: +1
Здравствуйте, teleroot, Вы писали:

T>Необходимо выбрать все узлы "//c", которые встречаются во всех "//row". Идентификация по атрибуту @ID.

T>В данном случае решением должен быть узел <c ID="2"/>.

T>Есть ли какие-либо идеи на этот счет?


Может так?
//с[@ID = ../@ID]
Re: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: _FRED_ Черногория
Дата: 30.05.13 11:03
Оценка:
Здравствуйте, teleroot, Вы писали:

T>Необходимо выбрать все узлы "//c", которые встречаются во всех "//row". Идентификация по атрибуту @ID.


//row/c[@ID = ../@ID]
Help will always be given at Hogwarts to those who ask for it.
Re[2]: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: hredwolf  
Дата: 31.05.13 20:45
Оценка:
Здравствуйте, PA, Вы писали:

PA>Здравствуйте, teleroot, Вы писали:



T>>Необходимо выбрать все узлы "//c", которые встречаются во всех "//row". Идентификация по атрибуту @ID.

T>>В данном случае решением должен быть узел <c ID="2"/>.

PA>Например, так можно:

PA>
PA>//row/c[count(//row[c/@ID = current()/@ID]) = count(//row)]
PA>


Не, так не покатит, потому что current()-у пофиг все, что происходит внутри предикатов — это контекстный нод.

Можно вот так:

<xsl:key name="row-by-c" match="row/c" use="@ID"/>
...

<xsl:value-of select="//c[count(//row) = count(key('row-by-c', @ID))]/@ID"/>
Re[3]: XPath. Ссылка на атрибут узла внутри вложенного критерия
От: hredwolf  
Дата: 31.05.13 20:54
Оценка:
С ключем ошибся, должен быть таким:

<xsl:key name="row-by-c" match="row" use="c/@ID"/>


Старый тоже работает, но только с учетом уникальности c/@ID в рамках одного row.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.