powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT. Вычесть одно множество узлов из другого..
8 сообщений из 8, страница 1 из 1
XSLT. Вычесть одно множество узлов из другого..
    #34374495
Pilot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть XML-файл следующего вида:
Код: plaintext
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.
<?xml version="1.0" ?>
<root>
	<nodes1>
		<node>
			<id> 1 </id>
			<name>name1</name>
		</node>
		<node>
			<id> 2 </id>
			<name>name2</name>
		</node>
		<node>
			<id> 3 </id>
			<name>name3</name>
		</node>
		<node>
			<id> 4 </id>
			<name>name4</name>
		</node>
		<node>
			<id> 5 </id>
			<name>name5</name>
		</node>
	</nodes1>
	<nodes2>
		<node>
			<id> 1 </id>
			<name>name1</name>
		</node>
		<node>
			<id> 2 </id>
			<name>name2</name>
		</node>
	</nodes2>
</root>

В XSL-файле, который используется для обработки этого XML, необходимо составить такой XPath, который бы возвращал набор узлов из <nodes1>..</nodes1>, которых нет в <nodes2>..</nodes2>
Т.е. нужно получить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
		<node>
			<id> 3 </id>
			<name>name3</name>
		</node>
		<node>
			<id> 4 </id>
			<name>name4</name>
		</node>
		<node>
			<id> 5 </id>
			<name>name5</name>
		</node>

Я читал про объединение ("|"), которое соединяет два набора узлов без повторов. Его можно было бы здесь употребить, однако, как я понял, сравниваются узлы в документе, а не их текстовые значения. Естественно, в выборке я получаю дубликаты.
...
Рейтинг: 0 / 0
XSLT. Вычесть одно множество узлов из другого..
    #34374537
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравнивать надо по обоим
<id>5</id>
<name>name5</name>
или достаточн будет по одному из них?
Это на тот случай если один из них будет иметь такое же значение, а другой, отличное
...
Рейтинг: 0 / 0
XSLT. Вычесть одно множество узлов из другого..
    #34374566
Pilot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну.. в моей задаче можно считать, что узлы считаются равными, если у них одинаковый <id>.
А вообще на будущее, конечно, хотелось бы получить решение в общем - когда требуется, чтобы узлы <node> были полностью одинаковы.
...
Рейтинг: 0 / 0
XSLT. Вычесть одно множество узлов из другого..
    #34374646
Pilot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuSa

Вообще, Вы натолкнули меня на мысль. :)
В моем случае можно сделать так:
Код: plaintext
select="/root/nodes1/node[not(/root/nodes2/node/id=./id)]"

Я как-то не подумал об этом. Благодарю!
...
Рейтинг: 0 / 0
XSLT. Вычесть одно множество узлов из другого..
    #34374674
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодец
Вот мое решение:
<xsl:template match="//nodes2">
<xsl:choose>
<xsl:when test="current()/node/id[text()]=//nodes1/node/id[text()]">
<xsl:copy-of select="current()"/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="//nodes2"/>
</xsl:template>
Правда оно почему то работает с точностью наоборот, никак не могу понять почему :)
...
Рейтинг: 0 / 0
XSLT. Вычесть одно множество узлов из другого..
    #34374732
Pilot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuSaПравда оно почему то работает с точностью наоборот, никак не могу понять почему :)

Потому что благодаря этому условию:
Код: plaintext
test="current()/node/id[text()]=//nodes1/node/id[text()]">

будут выводиться те узлы из <node2>..</node2>, которые есть и в <node1>..</node1>.
Т.е. получается пересечение набора узлов, а мне нужна была именно разность.
...
Рейтинг: 0 / 0
XSLT. Вычесть одно множество узлов из другого..
    #34374760
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нее, я это то понимаю, просто условие вида
test="current()/node/id[text()] !=//nodes1/node/id[text()]">
Выдавала такой же результат
...
Рейтинг: 0 / 0
XSLT. Вычесть одно множество узлов из другого..
    #34374774
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тьфу ты, осознал ошибку,у меня не зависимо от результата будет скопирован текущий узел, который проверялся, благодоря вот этой строчке
SuSa <xsl:copy-of select="current()"/>
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT. Вычесть одно множество узлов из другого..
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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