powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как отобрать узлы по нескольким элементам из другой ветки?
25 сообщений из 29, страница 1 из 2
Как отобрать узлы по нескольким элементам из другой ветки?
    #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
Как отобрать узлы по нескольким элементам из другой ветки?
    #39609705
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересует решение на XPath или подойдет XSL?
...
Рейтинг: 0 / 0
Как отобрать узлы по нескольким элементам из другой ветки?
    #39609727
dies irae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужен XPATH, при чём версии 1.0
...
Рейтинг: 0 / 0
Как отобрать узлы по нескольким элементам из другой ветки?
    #39609729
dies irae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя смотря что понимать под XSLT
если получится в xsl:variable запихнуть этот набор узлов, даже с помощью нескольких инструкций xslt, то сойдёт и такое решение
...
Рейтинг: 0 / 0
Как отобрать узлы по нескольким элементам из другой ветки?
    #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
Как отобрать узлы по нескольким элементам из другой ветки?
    #39609736
dies irae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фридрихdies irae,

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


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

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



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

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

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

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

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



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

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

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

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

странный фильтр для меня, одним выражением не осилю я на первой версии....
...
Рейтинг: 0 / 0
Как отобрать узлы по нескольким элементам из другой ветки?
    #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
Как отобрать узлы по нескольким элементам из другой ветки?
    #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
Как отобрать узлы по нескольким элементам из другой ветки?
    #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
Как отобрать узлы по нескольким элементам из другой ветки?
    #39609800
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dies irae,

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

на чем ты пытаешься решить эту задачу? РНР? или что другое?
...
Рейтинг: 0 / 0
Как отобрать узлы по нескольким элементам из другой ветки?
    #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
Как отобрать узлы по нескольким элементам из другой ветки?
    #39609825
dies irae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фридрихdies irae,

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

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

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


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