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

есть 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
07.07.2011, 19:47
    #37342020
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
построение иерархического дерева из плоского xml при помощи xsl
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
07.07.2011, 21:04
    #37342108
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
построение иерархического дерева из плоского 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.
<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
08.07.2011, 07:34
    #37342430
unics
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
построение иерархического дерева из плоского xml при помощи xsl
refreg,

ойёй. с oid я ошибся. везде должен быть просто id, копипаст (
спасибо, сейчас попробую разобраться )
...
Рейтинг: 0 / 0
08.07.2011, 09:58
    #37342601
unics
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
построение иерархического дерева из плоского xml при помощи xsl
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
08.07.2011, 10:19
    #37342657
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
построение иерархического дерева из плоского xml при помощи xsl
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
12.07.2011, 13:51
    #37347832
unics
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
построение иерархического дерева из плоского xml при помощи xsl
refreg,

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


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