Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > XML, XSL > XSLT 1.0: корректно добавить атрибуты |
Автор: av84 20.1.2015, 15:57 | ||||||
Привет всем. Прошу помочь разобраться с XSLT. Стоит задача выбрать определённый набор узлов из HTML-документа и преобразовать его - обернуть каждый узел в div и span. К примеру:
У узлов будет множество атрибутов. В этом вся загвоздка. Пишу xsl-документ:
Всё хорошо "оборачивается". Но как только я пытаюсь добавить или скопировать атрибуты, сразу же лезут ошибки. К примеру, если пишу
выдаётся "XSLTProcessor::importStylesheet(): element template only allowed as child of stylesheet" и "XSLTProcessor::importStylesheet(): XSLT-apply-templates: could not compile select expression '@color*'" Идеальный вариант был бы через for-each прогнать все атрибуты и скопировать/создать их, но ничего не выходит. Стоит ли что-то существенно переделать, избавившись от цикла, или дополнить текущий функционал? Буду очень признателен за помощь. |
Автор: diadiavova 20.1.2015, 18:00 | ||
Насколько я понимаю, таким образом ты хотел отобрать все атрибуты, начинающиеся с color? Такое не поддерживается, звездочкой можно заменить имя элемента или атрибута полностью, но применить ее к части имени не получится. Надо сделать как-то так примерно
Или в темплейте просто указать @color, а внутри уже в ифе копировать только те атрибуты, которые соответствуют этому условию. |
Автор: av84 21.1.2015, 07:38 | ||||
diadiavova, спасибо, но, к сожалению, не всё так просто (или наоборот проще некуда?). Мне нужно пройтись по всем узлам документа, выбрать определённый набор узлов, и заменить: - p, h1-h6 на div>span с таким же значением узлов, а атрибуты скопировать в span; - tr на div; - td на span. То есть, к примеру, из документа:
нужно получить
Узлы заменяются, а атрибуты не выходит скопировать. |
Автор: av84 22.1.2015, 08:11 |
diadiavova, спасибо большое. Это то, что нужно. P.S. прошу прощения, но по ошибке нажал "report" над вашим сообщением. |
Автор: diadiavova 23.1.2015, 00:05 |
Эт ничаво ![]() |
Автор: av84 9.2.2015, 15:44 | ||||||||
diadiavova, можно ещё спросить у вас помощи? Расширяю функционал преобразования, и не получается одна вещь. Стоит задача преобразовать, к примера, такой участок документа:
вот в такой:
То есть основная сложность - обернуть все текстовые узлы, входящие в td или th в sharedString, сохранив при этом атрибуты родительского узла. Что я сделал:
У меня получается следующее:
То есть не выходит скопировать атрибуты родителя текстового узла для sharedString. Буду очень вам признателен, если подскажите, как можно это сделать или где и что посмотреть для этого. |
Автор: diadiavova 9.2.2015, 16:18 | ||
Бегло просмотрел и вот что смутило
Пустой форич и копируешь неизвестно что и неизвестно куда, а в следующей ветке вроде копируешь атрибут, но при этом не создаешь элемент. Куда ты его копируешь? Я не вникал, может вечером посмотрю, если ты не решишь к тому времени, но сделать надо примерно так: обходи не текстовые узлы, а элементы, содержащие текстовые узлы примерно такие //td//*[text()], для каждого такого элемента создавай sharedString и копируй в него сначала атрибуты, потом - текст. |
Автор: av84 10.2.2015, 11:01 | ||||
Дело в том, что если так выбирать, то копируется всё один-в-один, не оборачивая текст в sharedString. Я немного доработал представленный мной же выше способ, и всё получилось как надо:
В любом случае спасибо. Вы меня натолкнули на мысль для другого преобразования =) |
Автор: av84 13.4.2015, 13:33 | ||||||||
Добрый день. У меня опять загвоздка. Начинаю понемногу разбираться в XSLT, но всё равно не всё выходит. Очень надеюсь на подсказку. Посмотрите, пожалуйста. Имеется преобразованная таблица. К примеру:
Преобразовываю я её, к слову, вот так:
И получается:
Но вопрос следующий: возможно ли получить такое:
? То есть добавить на места "ячеек", на которые распространяется "действие" rowspan'ов, пустые узлы с атрибутом nottransform. Получается, высчитываем по значению атрибута на какое кол-во элементов row распространяется "действие" rowspan'а, берём значение позиции элемента c и каким-то образом добавляем и сортируем? Или как? Как это лучше сделать? Возможно ли вообще подобное? Буду очень благодарен за помощь или подсказку. |