| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > XML, XSL > Преобразование XML в дерево |
| Автор: jekacorvus 28.12.2008, 15:48 |
| Здравствуйте!!! Помогите пожалуйста!!! есть вот такой код <Группа Идентификатор="ID00000002" Наименование="Гладкоствольное оружие"/> <Группа Идентификатор="ID020070" Наименование="ИМПОРТНОЕ" Родитель="ID00000002"/> <Группа Идентификатор="ID020088" Наименование="ALTAY" Родитель="ID020070"/> т.е. у Группа - есть Идентификатор и Родитель, нужно сделать вложенность <Группа Идентификатор="ID00000002" Наименование="Гладкоствольное оружие"> <Группа Идентификатор="ID020070" Наименование="ИМПОРТНОЕ" Родитель="ID00000002"> <Группа Идентификатор="ID020088" Наименование="ALTAY" Родитель="ID020070"> </Группа> </Группа> </Группа> |
| Автор: sir_nuf_nuf 28.12.2008, 16:46 |
| jekacorvus, это не код. это просто три строки. припишите к ним снизу </Группа> </Группа> </Группа> и получите то что просили. Если же это все таки код - то присыдайте XML полностью. А так же условия - на каком языке это пытаемся реализовать |
| Автор: jekacorvus 28.12.2008, 17:07 | ||
извините вот XML,который нужно обработать с помощью XSLT здесь получается у группы и у товара указан Родитель, но они не включены друг в друга <КоммерческаяИнформация> <Каталог> <Группа Идентификатор="ID00000002" Наименование="Гладкоствольное оружие"/> <Группа Идентификатор="ID020070" Наименование="ИМПОРТНОЕ" Родитель="ID00000002"/> <Группа Идентификатор="ID020088" Наименование="ALTAY" Родитель="ID020070"/> <Товар Идентификатор="ID02_473" Наименование="ALTAY de Lux к.12х76 отборный орех 5 д/н" Родитель="ID020088" Единица="ед"> <ЗначениеСвойства Значение="ALTAY de Lux к.12х76 отборный орех 5 д/н"/> </Товар> <Товар Идентификатор="ID02_472" Наименование="ALTAY Special к.12х76 отборный орех 5 д/н" Родитель="ID020088" Единица="ед"> <ЗначениеСвойства Значение="ALTAY Special к.12х76 отборный орех 5 д/н"/> </Товар> </Каталог> </КоммерческаяИнформация> должен получить на выходе XML с нормальной вложенностью <КоммерческаяИнформация> <Каталог> <Группа Идентификатор="ID00000002" Наименование="Гладкоствольное оружие"> <Группа Идентификатор="ID020070" Наименование="ИМПОРТНОЕ" Родитель="ID00000002"> <Группа Идентификатор="ID020088" Наименование="ALTAY" Родитель="ID020070"> <Товар Идентификатор="ID02_473" Наименование="ALTAY de Lux к.12х76 отборный орех 5 д/н" Родитель="ID020088" Единица="ед"> <ЗначениеСвойства Значение="ALTAY de Lux к.12х76 отборный орех 5 д/н"/> </Товар> <Товар Идентификатор="ID02_472" Наименование="ALTAY Special к.12х76 отборный орех 5 д/н" Родитель="ID020088" Единица="ед"> <ЗначениеСвойства Значение="ALTAY Special к.12х76 отборный орех 5 д/н"/> </Товар> </Группа> </Группа> </Группа> </Каталог> </КоммерческаяИнформация> |
| Автор: sir_nuf_nuf 28.12.2008, 17:42 |
| все ок хм.. все не тривиально. Вложенность Групп произвольная ? |
| Автор: jekacorvus 28.12.2008, 19:35 | ||
здесь получается у группы и у товара указан id родителя - Родитель и нужно вложить дочерние в родительские вложенность может быть любой глубины вот что я написал <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output encoding="utf-8" method="xml" indent="yes"/> <xsl:template match="/"> <xsl:apply-templates mode="line"/> </xsl:template> <xsl:template match="*" mode="line"> <xsl:variable name="nameCat" select="//Каталог/@Наименование"/> <Каталог Наименование="{$nameCat}"> <xsl:apply-templates select="//Группа" mode="item" /> </Каталог> </xsl:template> <xsl:template match="Группа" mode="item"> <Группа> <Наименование> <xsl:value-of select="@Наименование"/> </Наименование> <Идентификатор> <xsl:value-of select="@Идентификатор"/> </Идентификатор> <ИдентификаторВКаталоге> <xsl:value-of select="@ИдентификаторВКаталоге"/> </ИдентификаторВКаталоге> <Родитель> <xsl:value-of select="@Родитель"/> </Родитель> <xsl:variable name="identId" select="@Идентификатор"/> <xsl:apply-templates select="//Группа[@Родитель = $identId]" mode="item" /> </Группа> </xsl:template> </xsl:stylesheet> но здесь получается проблемка в том, что берется первый элемент, для него ищутся потомки, вставляются как надо. А потом тот же потомок получается корневым, т.е. попроще, очень много повторов. Я думал завести какой массив и загонять обработанные id элементов в массив, чтобы избавиься от повторов, а потом просто проверять на существование данного элемента в массиве и если есть, то не обрабатывать. Но не знаю можно ли такое в xslt. Или какой-нибудь другой вариант. |
| Автор: sir_nuf_nuf 29.12.2008, 02:19 | ||||||
| jekacorvus, у меня XSLT тупил с русскими именами - не стал разбираться - написал все английскими XML:
XSLT:
результат:
Вообщем, я немного усложнил, что бы корректно работало, когда несколько групп, потом товары, потом опять несколько групп.. Группа Группа Товар Товар Группа Товар Если таого не будет использовать - то все даже проще... P.S. кстати, спасибо за хорошую задачку! |
| Автор: jekacorvus 29.12.2008, 02:58 |
| Вообще большое пожалуйста!!! Я и сам задолбался, пока настроил русский. А вообще, огромное человеческое спасибо!!! Чтобы был рядом, угостил бы большой шоколадкой!!! И ты угадал со структурой, оно так и есть Группа Группа Товар Товар Группа Товар СПАСИБО тебе sir_nuf_nuf |
| Автор: sir_nuf_nuf 29.12.2008, 20:13 |
| не за что =) P.S. если проблема решена - тему нужно закрыть. Поищите кнопку. особую благодарность можно выражать "+" к репутации |
| Автор: jekacorvus 31.12.2008, 01:02 |
| Я бы с радостью повысить репутацию, но мне написали Обнаружена ошибка: У Вас недостаточно постов, чтобы изменять репутацию пользователей. Необходимо 100 постов. |
| Автор: jekacorvus 9.1.2009, 13:20 | ||
Как оказалось, я сначало не заметил как получилось. А оказалось xml имеет немного другой вид:
Все дело в том что структура следующая Группа1 Группа2 Родитель=Группа1 Группа3 Родитель=Группа2 Товар Родитель=Группа3 Товар Родитель=Группа3 Товар Родитель=Группа3 Группа4 Родитель=Группа2 Группа5 Родитель=Группа4 Товар Родитель=Группа5 Товар Родитель=Группа5 Товар Родитель=Группа5 Группа6 Группа7 Родитель=Группа6 Группа8 Родитель=Группа7 Товар Родитель=Группа8 Товар Родитель=Группа8 Товар Родитель=Группа8 и т.д. Потому тот код xsl не совсем правильно работает |
| Автор: jekacorvus 13.1.2009, 11:01 | ||
Спасибо, я уже сделал. Вот код, правда с добавками немного
Спасибо!!! |