Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как отобрать узлы по нескольким элементам из другой ветки? / 25 сообщений из 29, страница 1 из 2
02.03.2018, 13:57
    #39609645
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
подскажите, пожалуйста, как сделать следующую вещь:

есть набор персон и фильтр для них:

Код: 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.
<root>
	<filter>
		<person>
			<name>
				John
			</name>
			<surname>
				Smith
			</surname>
		</person>
	</filter>
	<data>
		<person>
			<name>
				John
			</name>
			<surname>
				Lumber
			</surname>
		</person>
		<person>
			<name>
				John
			</name>
			<surname>
				Smith
			</surname>
		</person>
		<person>
			<name>
				Bill
			</name>
			<surname>
				Carpenter
			</surname>
		</person>
	</data>
</root>



так мы отбираем тех, у кого имя есть в фильтре:

Код: css
1.
/root/data/person[name = /root/filter/person/name]



а как отобрать тех, у которых имя есть в фильтре, а фамилия отличается?
т.е. результат должен быть:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<person>
	<name>
		John
	</name>
	<surname>
		Lumber
	</surname>
</person>
...
Рейтинг: 0 / 0
02.03.2018, 15:23
    #39609705
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Интересует решение на XPath или подойдет XSL?
...
Рейтинг: 0 / 0
02.03.2018, 16:23
    #39609727
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
нужен XPATH, при чём версии 1.0
...
Рейтинг: 0 / 0
02.03.2018, 16:30
    #39609729
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
хотя смотря что понимать под XSLT
если получится в xsl:variable запихнуть этот набор узлов, даже с помощью нескольких инструкций xslt, то сойдёт и такое решение
...
Рейтинг: 0 / 0
02.03.2018, 16:42
    #39609733
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae,

ну так и пиши логический оператор AND

Код: xml
1.
/root/data/person[name = /root/filter/person/name AND тут путь который надо]


или так еще можно попробывать
Код: xml
1.
/root/data/person[name = /root/filter/person/name][surname = /root/filter/person/surname]
...
Рейтинг: 0 / 0
02.03.2018, 16:50
    #39609736
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Фридрихdies irae,

ну так и пиши логический оператор AND


спасибо за совет, но попробуй всё-же сначала вникнуть в постановку задачи

Код: plaintext
1.
/root/data/person[name = /root/filter/person/name][surname = /root/filter/person/surname]



это выведет всех персон, имя которых есть в фильтре и фамилия которых есть в фильтре, без связи одного с другим
...
Рейтинг: 0 / 0
02.03.2018, 16:58
    #39609738
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae,

тогда только через логический оператор AND
...
Рейтинг: 0 / 0
02.03.2018, 17:05
    #39609741
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Фридрихdies irae,

тогда только через логический оператор AND

нет
...
Рейтинг: 0 / 0
02.03.2018, 17:12
    #39609745
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae,

только что проверил у меня работает только так
Код: xml
1.
root/data/person[(name = ../../../root/filter/person/name) and (surname = ../../../root/filter/person/surname)]
...
Рейтинг: 0 / 0
02.03.2018, 17:21
    #39609750
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
красиво будет так
Код: xml
1.
root/data/person[(name = ancestor::root/filter/person/name) and (surname = ancestor::root/filter/person/surname)]
...
Рейтинг: 0 / 0
02.03.2018, 17:25
    #39609753
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Фридрихтолько что проверил у меня работает только так
Код: xml
1.
root/data/person[(name = ../../../root/filter/person/name) and (surname = ../../../root/filter/person/surname)]



нет, не то
я привёл результат, который должен получиться.
и условие: отобрать тех, у которых имя есть в фильтре, а фамилия отличается
т.е. для каждой персоны проходимся по персонам из фильтра. Если имя одинаковое, а фамилия разная - узел подходит.

а у тебя выдаёт всех, у которых имя входит в фильтр и фамилия входит в фильтр
...
Рейтинг: 0 / 0
02.03.2018, 17:33
    #39609764
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae,

ну так выбирай только по имени
Код: xml
1.
root/data/person[name = ancestor::root/filter/person/name]
...
Рейтинг: 0 / 0
02.03.2018, 17:42
    #39609770
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae,
вот задачу ты не совсем полностью описал, понял я тебя, т.е. в конечном файле надо исключить того кто есть в фильтре
если да, то так можно
Код: xml
1.
 root/data/person[(name = ancestor::root/filter/person/name) and not((surname = ancestor::root/filter/person/surname))]
...
Рейтинг: 0 / 0
02.03.2018, 17:43
    #39609771
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Фридрихну так выбирай только по имени

я бы выбрал только по имени, но мне нужно по фамилии
...
Рейтинг: 0 / 0
02.03.2018, 17:44
    #39609772
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Код: xml
1.
root/data/person[(name = ancestor::root/filter/person/name) and not(surname = ancestor::root/filter/person/surname)]
...
Рейтинг: 0 / 0
02.03.2018, 17:54
    #39609777
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Фридрих,

ты всё ещё не понимаешь
автордля каждой персоны проходимся по персонам из фильтра. Если имя одинаковое, а фамилия разная - узел подходит.

на таких данных
Код: 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.
<root>
	<filter>
		<person>
			<name>
				John
			</name>
			<surname>
				Smith
			</surname>
		</person>
		<person>
			<name>
				Bill
			</name>
			<surname>
				Lamber
			</surname>
		</person>
	</filter>
	<data>
		<person>
			<name>
				John
			</name>
			<surname>
				Lamber
			</surname>
		</person>
		<person>
			<name>
				Bill
			</name>
			<surname>
				Lamber
			</surname>
		</person>
	</data>
</root>


должно выдать:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<person>
	<name>
		John
	</name>
	<surname>
		Lamber
	</surname>
</person>
...
Рейтинг: 0 / 0
02.03.2018, 18:13
    #39609785
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae,

странный фильтр для меня, одним выражением не осилю я на первой версии....
...
Рейтинг: 0 / 0
02.03.2018, 18:22
    #39609789
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Фридрихdies irae,

странный фильтр для меня, одним выражением не осилю я на первой версии....

вот и я полдня бьюсь
сделал пока циклом в xslt

блин, в sql это элементарно делается
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select * 
from person 
where not exists(
    select * 
    from filter 
    where person.name = filter.name 
         and person.surname != filter.surname  
)
...
Рейтинг: 0 / 0
02.03.2018, 18:32
    #39609792
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae
блин, в sql это элементарно делается
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select * 
from person 
where not exists(
    select * 
    from filter 
    where person.name = filter.name 
         and person.surname != filter.surname  
)



тоже самое и в xpath
Код: xml
1.
root/data/person[name = ancestor::root/filter/person/name and surname != ancestor::root/filter/person/surname]
...
Рейтинг: 0 / 0
02.03.2018, 18:35
    #39609794
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Фридрихтоже самое и в xpath
Код: xml
1.
root/data/person[name = ancestor::root/filter/person/name and surname != ancestor::root/filter/person/surname]



нет. аналог в sql того, что ты написал:
Код: sql
1.
2.
3.
4.
select * 
from person 
where name in (select name from filter)
	and surname not in (select surname from filter)
...
Рейтинг: 0 / 0
02.03.2018, 18:45
    #39609800
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae,

если у тебя в фильтре будет только одна персона - то всё будет работать как ты хотел, а иначе я не знаю как сравнивать два массива....
...
Рейтинг: 0 / 0
02.03.2018, 19:10
    #39609803
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae,

на чем ты пытаешься решить эту задачу? РНР? или что другое?
...
Рейтинг: 0 / 0
02.03.2018, 19:28
    #39609816
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies irae,

попробуй вот это выражение
Код: xml
1.
root/data/person[contains(name, ancestor::root/filter/person/name) and not(contains(surname, ancestor::root/filter/person/surname))]
...
Рейтинг: 0 / 0
02.03.2018, 19:46
    #39609825
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
Фридрихdies irae,

на чем ты пытаешься решить эту задачу? РНР? или что другое?

на XSLT пытаюсь. собственно, я её решил, циклом, выше писал. но красивее было бы через чистый xpath

Фридрихпопробуй вот это выражение...
нет, это то же самое
...
Рейтинг: 0 / 0
02.03.2018, 19:59
    #39609832
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобрать узлы по нескольким элементам из другой ветки?
dies iraeнет, это то же самое
я тестировал на
Код: 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.
<root>
	<filter>
		<person>
			<name>
				John
			</name>
			<surname>
				Smith
			</surname>
		</person>
		<person>
			<name>
				Bill
			</name>
			<surname>
				Lamber
			</surname>
		</person>
	</filter>
	<data>
		<person>
			<name>
				John
			</name>
			<surname>
				Lamber
			</surname>
		</person>
		<person>
			<name>
				Bill
			</name>
			<surname>
				Lamber
			</surname>
		</person>
	</data>
</root>


1-
Код: xml
1.
2.
3.
4.
5.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
<xsl:copy-of select="root/data/person[contains(name, ancestor::root/filter/person/name) and not(contains(surname, ancestor::root/filter/person/surname))]"/>
    </xsl:template>
</xsl:stylesheet>


выводит
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<person>
			<name>
				John
			</name>
			<surname>
				Lamber
			</surname>
		</person>


и
2-
Код: xml
1.
2.
3.
4.
5.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
<xsl:copy-of select="root/data/person[name = ancestor::root/filter/person/name and surname != ancestor::root/filter/person/surname]"/>
    </xsl:template>
</xsl:stylesheet>


выводит
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<person>
			<name>
				John
			</name>
			<surname>
				Lamber
			</surname>
		</person><person>
			<name>
				Bill
			</name>
			<surname>
				Lamber
			</surname>
		</person>


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


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