![]() |
|
Модераторы: diadiavova |
![]()
|
|
| Mephisto |
|
||||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
Люди, можно ли при помощи xslt сделать такое преобразование. Сложность состоит в одном поле :(
Первый XML не мой, мне нужно получить второй.
нужно получить вот это:
|
||||
|
|||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
А в чём именно затруднение?
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Mephisto |
|
||||||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
распарсить вот эту строку:
И сделать тег:
и
Добавлено через 35 секунд И сгрупировать по ним как это в примере. |
||||||
|
|||||||
| diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Здесь помогут строковые функции XPath http://msdn.microsoft.com/ru-ru/library/ms256180.aspx в частности substring-before и substring-after Что-то в этом роде
Что касается сгруппировать, то сложность зависит от того, является ли возможное количество групп конечным, если да, то тогда можно примерно так сделать
Если групп немного ессно, а если неизвестно какие группы могут быть, то будет сложнее Код ни на чём не проверял - не для копипасты. Это сообщение отредактировал(а) diadiavova - 10.7.2010, 14:11 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||
|
|||||
| Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
diadiavova, нет, количество групп заранее неизвестно.
|
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
Ну сопсно выделить группы можно и так
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 7 Всего: 16 |
Ключи - наше все...
Это сообщение отредактировал(а) magelan - 13.7.2010, 17:05 |
|||
|
||||
| Mephisto |
|
||||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
magelan, спасибо, идея понятна. Осталось только сгруппировать еще и элементы как в примере.
Такое преобразование дает результат:
мне нужно:
|
||||
|
|||||
| Mephisto |
|
||||||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
magelan, то что я наваял можно как-то упростить, или нормально?
мне вот эта строчка не дает покоя, не совсем понимаю что происходит:
Ты выбираешь из множества узлов generate-id()=generate-id( что означает? key('g',substring-before(text(), '.') дает само по себе множество узлов насколько я понимаю. Добавлено через 2 минуты и 43 секунды С key я понял:
А вот как работает подстановка множества в generate-id() не совсем |
||||||
|
|||||||
| magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 7 Всего: 16 |
ключи - это способ групировать.
цикл идет по группам и получает их только один раз условие: generate-id()=generate-id( key('g',substring-before(text(), '.') позволяет выбрать ключевые группы, т.е. когда в цикл попадет группа <group>first. some second test</group> она будет проигнорированна, т.к. сгенерирует идентификатор не такой же, как и у группы <group>first. some test</group> теперь с элементами, спешил, плохо вчитался, поступаем как-то так:
думал, решил добавить: generate-id() - функция, которая генерирует уникальный идентификатор для данной ноды на пространстве документа. generate-id(key('g',substring-before(text(), '.'))) - тоже генерирует уникальный идентификатор, на том же пространстве документа. Разница лишь в том, что она это делает на пространстве имен ключей. В ключи попадают только уникальные ноды, которые встретились первыми. Одна и та же нода получит одинаковый идентификатор обоими функциями, если она попала в пространство ключей и соответственно разные идентификаторы, если она вне пространства ключей. Это сообщение отредактировал(а) magelan - 15.7.2010, 17:38 |
|||
|
||||
| Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
magelan, уфф. Пока синтаксически мне не совсем понятно, особенно
Пошел дальше дочитывать умные книжки. Спасибо! |
|||
|
||||
| magelan |
|
||||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 7 Всего: 16 |
смущает current()?
эту строку:
можно было записать так:
|
||||
|
|||||
| Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
У меня вообще проблемы с XPath пока
Добавлено через 32 секунды
Это тоже смущает. Не до конца понимаю. |
|||
|
||||
| magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 7 Всего: 16 |
Что именно?
давайте разбираться, это достаточно простое xPath выражение. Иногда приходится писать весьма злые икспасы, от которых у коллег сносит крышу:
|
|||
|
||||
| Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: нет Всего: 34 |
magelan, снесло крышу не только у коллег, но и у разметки винграда
|
|||
|
||||
![]()
|
| Правила форума "XML/XSLT" | |
|
|
Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась. Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение. Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел Желаем удачи в Вашем деле! Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | XML, XSL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |