powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Пронумеровать элементы XML с помощью XSL
9 сообщений из 9, страница 1 из 1
Пронумеровать элементы XML с помощью XSL
    #36054594
Masochist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так получилось, что знакомство с 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
Пронумеровать элементы XML с помощью XSL
    #36054749
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Masochistно учитывая не данное, а окончательное расположение
Так и не вкурил систему нумерации
...
Рейтинг: 0 / 0
Пронумеровать элементы XML с помощью XSL
    #36055394
Masochist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
math - элементы, которые надо пронумеровать.
featureAnchor - это ссылка на группу из элементов math.
math@number - аттрибут который нужно добавить - это порядок, в котором упоминается тот или иной <math> в исходном документе.
А упоминаться тот или иной math в исходном документе может либо прямо (sect1/math), либо по ссылке (sect1/featureAnchor).
...
Рейтинг: 0 / 0
Пронумеровать элементы XML с помощью XSL
    #36064348
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это будет эпичный секс.
...
Рейтинг: 0 / 0
Пронумеровать элементы XML с помощью XSL
    #36064360
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
count(preceding::math)
count(featureGroup/feature[@id=current()/preceding::featureAnchor/@features]/math)

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

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

Люблю злые икс-пасы:
Код: 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
Пронумеровать элементы XML с помощью XSL
    #36856521
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pakamist,

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


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