powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / построение иерархического дерева из плоского xml при помощи xsl
7 сообщений из 7, страница 1 из 1
построение иерархического дерева из плоского xml при помощи xsl
    #37341876
unics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
коллеги, день добрый.
может кто сможет помочь

есть 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.
36.
37.
38.
<?xml version="1.0" encoding="UTF-8"?>
<Objects>
	<Department id="d3">
		<Name>Dep3</Name>
		<ParentDepartment>
			<Department id="d1"/>
		</ParentDepartment>
	</Department>
	<Department oid="d2">
		<Name>Dep2</Name>
		<ParentDepartment>
			<Department id="d1"/>
		</ParentDepartment>
	</Department>
	<Department oid="d1">
		<Name>Dep1</Name>
		<ParentDepartment>
			<Department id="0"/>
		</ParentDepartment>
	</Department>
	<Department id="d4">
		<Name>Dep4</Name>
		<ParentDepartment>
			<Department id="d2"/>
		</ParentDepartment>
	</Department>
	<Department id="d5">
		<Name>Dep5</Name>
		<ParentDepartment>
			<Department id="d4"/>
		</ParentDepartment>
	</Department>
	<Department id="d6">
		<Name>Dep6</Name>
		<ParentDepartment>
			<Department id="d3"/>
		</ParentDepartment>
	</Department>
</Objects>


отдел со значением ParentDepartment/Department/@id="0" является корневым.
как этот файл можно трансформировать в иерархическое дерево при помощи xslt?
т.е. чтобы первым элементом был d1, далее его дети и т.д.
сам, к сожалению, с xml и xsl ранее не сталкивался, примеры, которые нагуглил, использовать не получилось.

спасибо
...
Рейтинг: 0 / 0
построение иерархического дерева из плоского xml при помощи xsl
    #37342020
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unics,

Код: 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.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:template match="/">
		<root>
			<xsl:call-template name="depart">
				<xsl:with-param name="nd" select="(//Department[ParentDepartment/Department/@id='0'])"/>
			</xsl:call-template>
		</root>
	</xsl:template>
	<!-- -->
	<xsl:template name="depart">
		<xsl:param name="nd"/>
		<xsl:choose>
			<xsl:when test="$nd">
				<xsl:for-each select="$nd">
					<xsl:copy>
						<xsl:attribute name="name">
							<xsl:value-of select="Name"/>
						</xsl:attribute>
						<xsl:attribute name="oid">
							<xsl:value-of select="@oid"/>
						</xsl:attribute>
						<xsl:attribute name="id">
							<xsl:value-of select="ParentDepartment/Department/@id"/>
						</xsl:attribute>
						<xsl:call-template name="depart">
							<xsl:with-param name="nd" select="(//Department[ParentDepartment/Department/@id=$nd/@oid])"/>
						</xsl:call-template>
					</xsl:copy>
				</xsl:for-each>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="'The End'"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>
Проверь с бОльшей вложенностью - мог накосячить ))
...
Рейтинг: 0 / 0
построение иерархического дерева из плоского xml при помощи xsl
    #37342108
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:key name="ddep" match="//Department" use="ParentDepartment/Department/@id"/>
	<xsl:template match="/">
		<root>
			<xsl:call-template name="depart">
				<xsl:with-param name="nd" select="key('ddep',0)"/>
			</xsl:call-template>
		</root>
	</xsl:template>
	<!-- -->
	<xsl:template name="depart">
		<xsl:param name="nd"/>
		<xsl:choose>
			<xsl:when test="$nd">
				<xsl:for-each select="$nd">
					<xsl:copy>
						<xsl:attribute name="name">
							<xsl:value-of select="Name"/>
						</xsl:attribute>
						<xsl:attribute name="oid">
							<xsl:value-of select="@oid"/>
						</xsl:attribute>
						<xsl:attribute name="id">
							<xsl:value-of select="ParentDepartment/Department/@id"/>
						</xsl:attribute>
						<xsl:call-template name="depart">
							<xsl:with-param name="nd" select="key('ddep',@oid)"/>
						</xsl:call-template>
					</xsl:copy>
				</xsl:for-each>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="'The End'"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>
Тоже самое, но с ключем. В посте выше есть ошибочка, предлагаю найти самому. Вся проблема, что в исходном xml тоже есть ошибочка - путаница с oid и id. Может из-за этого и не получались нагугленные примеры...
...
Рейтинг: 0 / 0
построение иерархического дерева из плоского xml при помощи xsl
    #37342430
unics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg,

ойёй. с oid я ошибся. везде должен быть просто id, копипаст (
спасибо, сейчас попробую разобраться )
...
Рейтинг: 0 / 0
построение иерархического дерева из плоского xml при помощи xsl
    #37342601
unics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg,

в xml поменял все oid на id.
убрал букву в коде отдела, оставил только цифру.

сейчас 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.
36.
37.
38.
39.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type='text/xsl' href='test.xsl'?>
<Objects>
	<Department id="3">
		<Name>Dep3</Name>
		<ParentDepartment>
			<Department id="1"/>
		</ParentDepartment>
	</Department>
	<Department id="2">
		<Name>Dep2</Name>
		<ParentDepartment>
			<Department id="1"/>
		</ParentDepartment>
	</Department>
	<Department id="1">
		<Name>Dep1</Name>
		<ParentDepartment>
			<Department id="0"/>
		</ParentDepartment>
	</Department>
	<Department id="4">
		<Name>Dep4</Name>
		<ParentDepartment>
			<Department id="2"/>
		</ParentDepartment>
	</Department>
	<Department id="5">
		<Name>Dep5</Name>
		<ParentDepartment>
			<Department id="4"/>
		</ParentDepartment>
	</Department>
	<Department id="6">
		<Name>Dep6</Name>
		<ParentDepartment>
			<Department id="3"/>
		</ParentDepartment>
	</Department>
</Objects>

аналогично заменил в xsl все oid на id.

получается список
Main
Dep2
Dep4

остальные отделы не отображаются (
...
Рейтинг: 0 / 0
построение иерархического дерева из плоского xml при помощи xsl
    #37342657
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unics,

У меня выдает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<root>
	<Department name="Dep1" oid="" id="0">
		<Department name="Dep3" oid="" id="1">
			<Department name="Dep6" oid="" id="3">The End</Department>
		</Department>
		<Department name="Dep2" oid="" id="1">
			<Department name="Dep4" oid="" id="2">
				<Department name="Dep5" oid="" id="4">The End</Department>
			</Department>
		</Department>
	</Department>
</root>
То есть принцип продемонстрирован... Если есть вопросы, делай тестовые примеры, и показывай, что сделано.
...
Рейтинг: 0 / 0
построение иерархического дерева из плоского xml при помощи xsl
    #37347832
unics
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg,

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


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