|
|
|
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
|
|||
|---|---|---|---|
|
#18+
Привет. Есть задача построить иерархическое дерево, используя 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? Помогите плиз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 18:53 |
|
||
|
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
|
|||
|---|---|---|---|
|
#18+
в XSL реально все, что задумано в спецификации :) прошу уточнить задачу таким образом: 1) пример входного xml-файла 2) пример выходного xml-файла 3) откуда - куда идет преобразование: xml->xml \ xml->html \ xml -> text? 3) если элементы и атрибуты в процессе преобразования меният названия, то их соответствие 4) и пример того, что вы сами можете над этим сделать только после этого можно Вас корректно скорректировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 19:30 |
|
||
|
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
|
|||
|---|---|---|---|
|
#18+
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] ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 11:30 |
|
||
|
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
|
|||
|---|---|---|---|
|
#18+
inshuПривет. Есть задача построить иерархическое дерево, используя XSLT: .... Реально ли сделать такое в XSLT? Или лучше сначала привести XML к нужному виду. Если да, то как это сделать в XSLT? Помогите плиз. Гы-гы, небольшой поиск по и-нету дал сразу же очень интересный результат: тут лежит описание "построителя" XSLT-шаблонов для подобных задач а тут - примерчики его использования... З.Ы. видимо, "в лоб" в общем виде задача не решаема... (а жаль). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 17:21 |
|
||
|
Как построить иерархическое дерево из XML имеющего другую иерархию элементов?
|
|||
|---|---|---|---|
|
#18+
qu-quЗ.Ы. видимо, "в лоб" в общем виде задача не решаема... (а жаль). Вдогонку сам себе - вот и более "общие" алгоритмы нашлись... (главное - знать, что ищешь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 17:38 |
|
||
|
|

start [/forum/topic.php?fid=14&msg=33434146&tid=1334924]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 501ms |

| 0 / 0 |
