Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT. Вычесть одно множество узлов из другого.. / 8 сообщений из 8, страница 1 из 1
06.03.2007, 14:05
    #34374495
Pilot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT. Вычесть одно множество узлов из другого..
Есть 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
06.03.2007, 14:14
    #34374537
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT. Вычесть одно множество узлов из другого..
Сравнивать надо по обоим
<id>5</id>
<name>name5</name>
или достаточн будет по одному из них?
Это на тот случай если один из них будет иметь такое же значение, а другой, отличное
...
Рейтинг: 0 / 0
06.03.2007, 14:21
    #34374566
Pilot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT. Вычесть одно множество узлов из другого..
Ну.. в моей задаче можно считать, что узлы считаются равными, если у них одинаковый <id>.
А вообще на будущее, конечно, хотелось бы получить решение в общем - когда требуется, чтобы узлы <node> были полностью одинаковы.
...
Рейтинг: 0 / 0
06.03.2007, 14:39
    #34374646
Pilot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT. Вычесть одно множество узлов из другого..
SuSa

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

Я как-то не подумал об этом. Благодарю!
...
Рейтинг: 0 / 0
06.03.2007, 14:43
    #34374674
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT. Вычесть одно множество узлов из другого..
Молодец
Вот мое решение:
<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
06.03.2007, 14:56
    #34374732
Pilot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT. Вычесть одно множество узлов из другого..
SuSaПравда оно почему то работает с точностью наоборот, никак не могу понять почему :)

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

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


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