![]() |
|
Модераторы: diadiavova |
![]()
|
|
| tomboy1 |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 29.2.2012 Репутация: нет Всего: нет |
Добрый день, форумчане!
Только зарегистрировался, встречайте новичка! Собственно, интересный, на мой взгляд, сабж. Есть xml-файл с примерно следующей разметкой:
Необходимо из него вывести текстовый файл с примерно таким содержанием:
Не совсем так. Строчек point должно быть столько, сколько есть всевозможных комбинаций опциональных параметров (isOptional="yes") + обязательных (isOptional="no"). То есть точно вывод должен быть такой:
или в другом порядке, это неважно. Строки потом можно отформатировать. Последнее, что пришло в голову - это следующее:
Но это все равно должным образом не работает. Кто-нибудь может помочь? Вообще, обход всевозможных вариантов средством xsl возможен? Бьюсь с этим уже неделю. Боюсь, что скоро мысли иссякнут Это сообщение отредактировал(а) tomboy1 - 29.2.2012, 22:21 |
||||||||
|
|||||||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
tomboy1, честно говоря, из объяснения я не понял по какому принципу формируются выходные данные.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| tomboy1 |
|
||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 29.2.2012 Репутация: нет Всего: нет |
Спасибо за внимание. У поля field в xml-файле есть атрибут isOptional. Если этот атрибут равен yes, то поле опционально, т.е. может учитываться для выходных данных, а может и нет. А если этот атрибут равен no, то это поле является обязательным. Выходные данные формируются так: строчка выходных данных - это заголовок (name из type) + комбинация обязательных и не обязательных полей. Кол-во таких строчек = кол-ву комбинаций. Итого для той xml получаем:
где point - значение атрибута name в тэге type (ставится перед каждой комбинацией полей field), lat, lon, lur, lit - т.е. то, что в квадратных скобках - всевозможные комбинации атрибутов name в field в зависимости от опциональности. Т.е., например, для следующей xml:
выходные данные будут такими:
А для такой xml (добавил еще одно field с isOptional="yes"):
выходные данные должны быть такими:
Я сделал xml-ки максимально простыми, чтобы было понятно, как необходимо построить выходные данные. Сейчас должно быть понятно. П.С. Порядок атрибутов в квадратных скобках не учитывается. Т.е. для последней xml все равно, что " - point: [lur, lon, lit]", что " - point: [lon, lur, lit]". Не учитывается, потому что эти атрибуты потом все равно будут сортироваться. |
||||||||||||
|
|||||||||||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 22 Всего: 142 |
tomboy1, то есть ты хочешь, чтобы преобразование выдавало все комбинации возможных параметров?
Идея есть. Достаточно геморно, но, как мне кажется, вполне решаемо. Значит во всех случаях сначала выставляем обязательные параметры (чтобы больше о них не думать). Что касается необязательных, то тут сначала подсчитываем сколько будет комбинаций. Это достаточно легко сделать, поскольку количество их будет равно 2^n, где n - количество необязательных параметров. В языке, поддерживающем императивную вычислительную логику, на этом этапе следовало бы написать цикл, где счетчик изменялся бы от 1 до вычисленного числа (2^n). Но поскольку тут циклов нет, его придется заменить рекурсивным шаблоном, в котором роль счетчика будет выполнять параметр и отсчет лучше вести в обратном направлении. Внутри шаблона, для того, чтобы определить нужно в данной итерации вставлять тот или иной параметр, можно воспользоваться двоичной системой счисления, то есть представить текущее значение счетчика в двоичной системе и в таком представлении каждый разряд двоичного числа будет соответствовать одному параметру(если это единица - вставляем параметр, если ноль - нет). Реализация этого всего достаточно громоздка, но если ты идею понял, то видимо ничего сверхъестественного нет. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| tomboy1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 29.2.2012 Репутация: нет Всего: нет |
Примерно понял. Будем думать, спасибо.
Да уж, задачка не из тривиальных |
|||
|
||||
| magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 7 Всего: 16 |
Как-то так:
Это сообщение отредактировал(а) magelan - 2.3.2012, 15:09 |
|||
|
||||
![]()
|
| Правила форума "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. |