|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Добрый день. Возникла необходимость преобразовать один XML в другой, а точнее все атрибуты элементов первого xml сделать элементами в новом xml и дать им новые имена. Пример моего первоначального xml: <?xml version='1.0' encoding='utf-8'?> <document> <item name='F'> <textlist> <text>Иванов</text> </textlist> </item> <item name='I'> <textlist> <text>Семен</text> </textlist> </item> </document> Что должно получиться в итоге: <?xml version="1.0" encoding="utf-8"?> <ApplicationFile xmlns:xsi=" http://www.w3.org/20...chema-instance" xsi:noNamespaceSchemaLocation="Front_Request.xsd"> <ApplicationsList> <lastname>Иванов</lastname> <firstname>Семен</firstname> </ApplicationsList> </ApplicationFile> На просторах инета нашел пример такого преобразования, только не могу понять что есть что: <xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/19...XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="@*"> <xsl:element name="{local-name(.)}" namespace="{namespace-uri(..)}"> <xsl:value-of select="."/> </xsl:element> </xsl:template> </xsl:stylesheet> В общем вопросы: 1 <xsl:template match="@*"> - эта конструкция выбирает атрибуты на любой "глубине" вложенности? 2 что подставить вместо {local-name(.)}? 3 какое пространство имен указать вместо {namespace-uri(..)}? Обычное xmlns:xsl=" http://www.w3.org/19...XSL/Transform"? PS: Знаком с XML и XSLT весьма поверхностно. Прошу помощи, а не ссылок. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2012, 11:15 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Jackssson, 1 у шаблона нет понятия глубины, эта конструкция отработает всегда, когда ее позовут 2, 3... не поможет, вы нашли некий шаблон для решения конкретной задачи он вам не подходит. Вы не расписали четких правил мепинга, а начинать надо именно с них, поэтому я буду предполагать. Вам нужен "тупой" мэппинг, написанный например так: Код: xml 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2012, 13:44 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
очепяточка, так надо Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2012, 13:46 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Спасибо большое. Ваше решение у меня работает, но только если не объявлен в самом xml неймспейс. Код: xml 1. 2. 3. 4. 5. 6. 7.
Если корневой элемент у меня выглядит так, то ничего не работает: Код: xml 1. 2. 3. 4. 5.
То есть он мне выдает: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Можно ли как то игнорировать пространство имен? Честно говоря не знаю, возможно ли исключить его из выгрузки. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2012, 15:14 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Jackssson, Ммм. Прикольно, сто лет лотус xml не видел, попробуйте для начала заменить в stylesheet соответствующее значение атрибута. Если не получится, думаю, вам гугл поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 01:02 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
mage.lanпопробуйте для начала заменить в stylesheet соответствующее значение атрибута. Честно говоря не совсем понял, о чем речь. Можете пояснить? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 09:02 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Jackssson, Код: xml 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 09:10 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Сделал немного по другому: есть первый xsl, который тупо копирует xml без namespace`a: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
и второй, который приводит xml к нужному виду: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Как их правильно объединить? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2012, 13:05 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Jackssson, а первый нужен вообще? второй без него не работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2012, 13:51 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
нет, не работает. Там какая то фигня с пространством имен. Решения я не нашел. Если к моему dxl применять только второй xsl, то он не видит вложенных элементов. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2012, 14:33 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Jacksssonнет, не работает. Там какая то фигня с пространством имен. Решения я не нашел. Если к моему dxl применять только второй xsl, то он не видит вложенных элементов. ну если первый вариант работает, попробуйте что-нить в этом духе (тяжело гадать, не видя исходный xml): Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2012, 15:30 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Исходный xml очень большой, вот его укороченный вариант: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
В общем схема трансформации получается такая - dxl(domino xml)=>xsl_1(убирает namespace)=>xsl_2(переименовывает элементы)=>конечный xml. Появилась идея, сделать некий справочник внешний: имя атрибута в dxl=имя элемента конечного xml, а затем в цикле через переменную подставлять, но работать что то не хочет, пишет что xsl не валидный. Может кто делал такое? Что лучше использовать - import или include? Какова должна быть структура этого отдельного файла-справочника? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 13:29 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Разобрался, как использовать внешний xml. Исходный xml указан выше. Отдельный xml, который используется как справочник: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
XSL: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
При попытке трансформации пишет, что xsl невалидный. Что не так? Может нельзя так использовать переменную? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 13:06 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
JacksssonПри попытке трансформации пишет, что xsl невалидный.Прямо так и пишет? Или это Ваш вольный перевод сообщения об ошибке? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 17:15 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Ошибка: Unable to apply transformation on current source. Make sure that XSL is valid. Ну собственно с валидностью xsl я уже разобрался. Чтобы окончательно никого не запутывать объясню все еще раз. Есть у меня xml(из lotus domino): Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Мне надо его привести к виду: Код: xml 1. 2. 3. 4. 5. 6. 7.
То есть что то переименовать, что создать и тд. Пробую все это сделать в цикле и через переменную: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Отдельный xml, в котором описано, что на что будет меняться: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
Использую Oxigen. Сейчас загвоздка в том, что в дебагере, на 13й строке Код: xml 1.
он мне пишет, что Invalid element name, хотя в переменной лежит стринг. Не понимаю почему так... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2012, 11:35 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Jacksssonхотя в переменной лежит стринг.Какой? Код: xml 1.
Что выводит? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2012, 14:28 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
equiName="lastname", dxlName="F". Если вставить вашу конструкцию в xsl перед созданием элемента, получается следующее: Код: xml 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2012, 14:59 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
JacksssonЕсли вставить вашу конструкцию в xsl перед созданием элемента, получается следующее:Откуда в переменной взялись пробелы? Уберите их при формировании значения переменной ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2012, 01:05 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
RTFM normalize-string() ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2012, 01:06 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
Там видимо табуляция была. Все убрал, ошибка исчезла. Теперь другая проблема - структура конечного документ создается нормально: Код: xml 1. 2. 3. 4. 5.
но нужные значения не подтягиваются и вложенные элементы остаются пустыми. Предполагаю, что дело в конструкции Код: xml 1. 2. 3.
Получается что внутри цикла я нахожусь в контексте документа diсtionary.xml, а значения в элементы выбираю из контекста исходного xml. Где то читал, что "если шаблон содержит инструкции xsl:apply-templates или xsl:for-each, которые дополнительно выбирают узлы для обработки, процесс рекурсивно продолжается до тех пор, пока обрабатываемое множество будет содержать хотя бы один узел"©. Как правильно выйти из этой ситуации? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2012, 15:20 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
JacksssonКак правильно выйти из этой ситуации?В контексте основного документа Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2012, 16:39 |
|
XSLT. Преобразование атрибутов в элементы
|
|||
---|---|---|---|
#18+
_Vasilisk_, а где ее объявить? В цикле или перед? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2012, 16:47 |
|
|
start [/forum/topic.php?fid=14&msg=38079527&tid=1332601]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
158ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 242ms |
total: | 499ms |
0 / 0 |