powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
5 сообщений из 5, страница 1 из 1
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
    #33434146
inshu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Есть задача построить иерархическое дерево, используя XSLT:
-catalog_1
--schema_1
---table_1
---table_2
...
--schema_2
---table_1
...
-catalog_2
...

Задача вроде очень простая, но исходный XML имеет другую иерархическую структуру:

<MsgResponse>
<Tuples>
<Tuple>
<Value>system</Value> <-- Catalog name
<Value>metadata</Value> <-- Schema name
<Value>Types</Value> <--Table name
</Tuple>
<Tuple>
<Value>system</Value>
<Value>metadata</Value>
<Value>Spaces</Value>
</Tuple>
<Tuple>
<Value>system</Value>
<Value>security</Value>
<Value>Users</Value>
</Tuple>
<Tuple>
<Value>system</Value>
<Value>security</Value>
<Value>Roles</Value>
</Tuple>
<Tuple>
<Value>user</Value>
<Value>metadata</Value>
<Value>Functions</Value>
</Tuple>
....
</Tuples>
</MsgResponse>

Пробовал разные варианты следующей конструкции, но что-то position() нифига не работает.
....
<xsl:template match="MsgResponse">
<html>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>

<xsl:template match="Tuples">
<xsl:for-each select="Tuple">
<xsl:if test="not (Tuple[position()-1]/Value[1] = Value[1]) ) ">
<div>-> <xsl:value-of select="Value[1]" /></div>
</xsl:if>
<div>-> <xsl:value-of select="Value[2]" /></div>
<div>--> <xsl:value-of select="Value[3]" /></div>
<xsl:for-each select="Value[4]/Tuples/Tuple">
<div>---> <xsl:value-of select="Value" /></div>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
....

Реально ли сделать такое в XSLT? Или лучше сначала привести XML к нужному виду. Если да, то как это сделать в XSLT? Помогите плиз.
...
Рейтинг: 0 / 0
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
    #33434210
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в XSL реально все, что задумано в спецификации :)

прошу уточнить задачу таким образом:
1) пример входного xml-файла

2) пример выходного xml-файла

3) откуда - куда идет преобразование: xml->xml \ xml->html \ xml -> text?

3) если элементы и атрибуты в процессе преобразования меният названия, то их соответствие

4) и пример того, что вы сами можете над этим сделать

только после этого можно Вас корректно скорректировать.
...
Рейтинг: 0 / 0
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
    #33435130
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
M0usв XSL реально все, что задумано в спецификации :)

С этим тезисом категорически согласен, т.к. такое чувство сложилось от прочтения вопроса, что автор спрашивает - "можно ли что-то сделать на XSLT, и если нельзя, то - как это сделать на XSLT?"
M0us
прошу уточнить задачу таким образом:

Тут немного не соглашусь, т.к. информации в вопросе, на мой взгляд, вполне достаточно...
M0us
1) пример входного xml-файла

<MsgResponse>
<Tuples>
<Tuple>
<Value>system</Value> <-- Catalog name
<Value>metadata</Value> <-- Schema name
<Value>Types</Value> <--Table name
...
- это ли не "пример входного xml-файла"?
M0us
2) пример выходного xml-файла

-catalog_1
--schema_1
---table_1
---table_2
...
- это ли не "пример выходного xml-файла"?
M0us
3) откуда - куда идет преобразование: xml->xml \ xml->html \ xml -> text?

Какая, по-сути, разница, куда именно идет преобразование? (откуда - вообще не вопрос, т.к. известно откуда - "из XML, родимого, из кого же еще?").
Главное в вопросе не то, что за текст нужно получить на выходе XSLT-процессора, а то - что необходимо преобразовать "плоскую" ("табличную") структуру входного файла (с повторяющимися значениями на уровнях группировки Catalog и Schema) в "деревянную" ("иерархическую") структуру файла выходного (с "объединенными" верхними уровнями и "детализированными" нижними).
M0us
3) если элементы и атрибуты в процессе преобразования меният названия, то их соответствие

Даже я догадался:
"Tuple/Value[1]" -> <Catalog>
"Tuple/Value[2]" -> <Schema>
"Tuple/Value[3]" -> <Table>
M0us
4) и пример того, что вы сами можете над этим сделать

Даже это имеется:
<xsl:template match="Tuples">
<xsl:for-each select="Tuple">
<xsl:if test="not (Tuple[position()-1]/Value[1] = Value[1]) ) ">
...
Из примера шаблона явно видно, что человек хочет преобразовать xml -> html (т.к. где-то там в тексте <div> мелькает).
Так что вопрос для вас остается пока открытым...

Теперь по сути вопроса, сейчас нет времени готовить пример кода, но думаю, что надо двигаться в направлении определения набора узлов с DISTINCT-значениями "полей" Tuple/Value[1] и Tuple/Value[2] , и сравнивать нужно не каждый с первым (как, ИМХО, в приведенном примере <xsl:if test="not (Tuple[position()-1]/Value[1] = Value[1]) ) ">), а перебирать сразу "нужный" набор узлов в <xsl:for-each ...> , выражение для select="" можно попробовать построить на основе сравнения Tuple/Value[1] с осью following-sibling::Value[1] для него же, и выбором из всего результирующего "декартова произведения" только первого элемента, что-то типа так: <xsl:for-each select="Tuple[ Value[1]=following-sibling::Value[1] ][1]"> по-моему должно дать DISTINCT-список узлов Tuple по значению первого "поля" Value .

Прошу прощения, что выдаю "сырую" идею, т.к. нет сейчас времени ни на проверку, ни на подготовку реального работающего примера.

З.Ы. тем более, что для второго уровня "дерева" ( Tuple/Value[2] ) XPath будет "покруче", т.к. в нем придется находить DISTINCT-список по набору из 2-х элементов одновременно ( Tuple/Value[1] и Tuple/Value[2] ).
...
Рейтинг: 0 / 0
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
    #33438858
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
inshuПривет.
Есть задача построить иерархическое дерево, используя XSLT:
....
Реально ли сделать такое в XSLT? Или лучше сначала привести XML к нужному виду. Если да, то как это сделать в XSLT? Помогите плиз.

Гы-гы, небольшой поиск по и-нету дал сразу же очень интересный результат:
тут лежит описание "построителя" XSLT-шаблонов для подобных задач

а тут - примерчики его использования...

З.Ы. видимо, "в лоб" в общем виде задача не решаема... (а жаль).
...
Рейтинг: 0 / 0
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
    #33438944
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-quЗ.Ы. видимо, "в лоб" в общем виде задача не решаема... (а жаль).

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


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