Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Пронумеровать элементы XML с помощью XSL / 9 сообщений из 9, страница 1 из 1
22.06.2009, 20:16
    #36054594
Masochist
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать элементы XML с помощью XSL
Так получилось, что знакомство с XSL у меня началось со сложной задачи, к которой я не знаю, как подступиться. Надо написать xsl-шаблон, который преобразует начальный XML в конечный XML, в котором элементы <math> будут пронумерованы (добавится атрибут number) в порядке возрастания, но учитывая не данное, а окончательное расположение, в котором элементы <feature> встанут на место <featureAnchor>ов с соответствующими id.

Начальный XML

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<component>
	<sect1>
		<math id="c01-math-0001"/>
		<featureAnchor features="c01-fea-0001"/>
		<math id="c01-math-0002"/>
	</sect1>
	<sect1>
		<featureAnchor features="c01-fea-0002"/>
		<math id="c01-math-0003"/>
		<math id="c01-math-0004"/>
	</sect1>
	<featureGroup>
		<feature id="c01-fea-0001">
			<math id="c01-math-0005"/>
		</feature>
		<feature id="c01-fea-0002">
			<math id="c01-math-0006"/>
			<math id="c01-math-0007"/>
		</feature>
	</featureGroup>
</component>

Конечный XML

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<component>
	<sect1>
		<math number="1" id="c01-math-0001"/>
		<featureAnchor features="c01-fea-0001"/>
		<math number="3" id="c01-math-0002"/>
	</sect1>
	<sect1>
		<featureAnchor features="c01-fea-0002"/>
		<math number="6" id="c01-math-0003"/>
		<math number="7" id="c01-math-0004"/>
	</sect1>
	<featureGroup>
		<feature id="c01-fea-0001">
			<math number="2" id="c01-math-0005"/>
		</feature>
		<feature id="c01-fea-0002">
			<math number="4" id="c01-math-0006"/>
			<math number="5" id="c01-math-0007"/>
		</feature>
	</featureGroup>
</component>
...
Рейтинг: 0 / 0
22.06.2009, 23:48
    #36054749
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать элементы XML с помощью XSL
Masochistно учитывая не данное, а окончательное расположение
Так и не вкурил систему нумерации
...
Рейтинг: 0 / 0
23.06.2009, 12:25
    #36055394
Masochist
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать элементы XML с помощью XSL
math - элементы, которые надо пронумеровать.
featureAnchor - это ссылка на группу из элементов math.
math@number - аттрибут который нужно добавить - это порядок, в котором упоминается тот или иной <math> в исходном документе.
А упоминаться тот или иной math в исходном документе может либо прямо (sect1/math), либо по ссылке (sect1/featureAnchor).
...
Рейтинг: 0 / 0
29.06.2009, 14:18
    #36064348
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать элементы XML с помощью XSL
это будет эпичный секс.
...
Рейтинг: 0 / 0
29.06.2009, 14:22
    #36064360
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать элементы XML с помощью XSL
count(preceding::math)
count(featureGroup/feature[@id=current()/preceding::featureAnchor/@features]/math)

так, набросок
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
20.09.2010, 14:47
    #36855563
pakamist
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать элементы XML с помощью XSL
Masochist, А я сделал (правда на 2.0 версии) . Ничего вообщем сложного. Нужно только сначала написать алгоритм (функциональный), а затем разбить задачу на мелкие части (их вышло 12). Если у кого есть короткое решение, интересно было бы посмотреть, но подозреваю что его нет, потому что исходная база не реляционная, увы.
...
Рейтинг: 0 / 0
20.09.2010, 16:49
    #36855904
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать элементы XML с помощью XSL
Masochist,

А два раза применить трансформацию можно? Один раз, что бы развернуть все группы и привести данные в "нормальную" форму. А во второй раз - пронумеровать, и снова свернуть все группы.
...
Рейтинг: 0 / 0
21.09.2010, 01:58
    #36856517
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать элементы XML с помощью XSL
Надеюсь это не тестовое задание в какую-нить контору...

Люблю злые икс-пасы:
Код: 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.
36.
37.
<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output method="xml" />
	
	<xsl:variable name="all-anchor" select="//featureAnchor" />
	<xsl:variable name="all-feature" select="//feature" />
	
	<xsl:template match="/">
		<xsl:apply-templates />
	</xsl:template>
	<xsl:template match="text()">
		<xsl:copy-of select="." />
	</xsl:template>
	<xsl:template match="*">
		<xsl:copy>
			<xsl:copy-of select="@*" />
			<xsl:apply-templates />
		</xsl:copy>
	</xsl:template>
	<xsl:template match="math">
		<xsl:copy>
			<xsl:copy-of select="@*" />
			<xsl:attribute name="number">
				<xsl:choose>
					<xsl:when test="parent::feature">
						<xsl:variable name="id" select="parent::feature/@id" />
						<xsl:value-of select="count($all-anchor[@features=$id]/preceding::math) + count($all-feature[@id=$all-anchor[@features=$id]/preceding::featureAnchor/@features]/math) + count(preceding-sibling::math) + 1" />
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="count(preceding::math) + count($all-feature[@id=current()/preceding::featureAnchor/@features]/math) + 1" />
					</xsl:otherwise>
				</xsl:choose>
			</xsl:attribute>
			<xsl:apply-templates />
		</xsl:copy>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
21.09.2010, 02:06
    #36856521
mage.lan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать элементы XML с помощью XSL
pakamist,

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


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