| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > помогите составить xslt файл |
| Автор: NieL 22.12.2010, 15:38 | ||||||
Исходный XML-файл
Помогите составить XSLT-файл по которому из исходного XML-файла формируется новый XML-файл, содержащий в себе узлы updr и file у которых атрибуты from_ver и to_ver <> -1, т.е. должно получится: Результирующий XML-файл
Код использования уже написан:
|
| Автор: cat512 22.12.2010, 19:25 | ||
| У тебя исходный файл не валидный! попробуй это
|
| Автор: NieL 22.12.2010, 20:02 | ||
уже пробовал так, условие выполняется для всех узлов, мне же нужно проверять и отбирать только узлы updr и file, остальные игнорировать. |
| Автор: cat512 22.12.2010, 23:53 | ||||||
Что мешает немного изменить скрипт?, например так
Только обрати внимание этим скриптом не будет соблюдаться порядок следования узлов в дереве. Если порядок важен, то то надо использовать ось child |
| Автор: NieL 23.12.2010, 00:02 | ||||
Я пытался сделать все в рамках одного select'a, чтобы не дублировать одни и те же условия для нужных мне веток, но так и не получилось, в любом случае спасибо за помощь. |
| Автор: cat512 23.12.2010, 01:13 | ||
Вот тебе одним select-oм и в сущ. порядке
|
| Автор: NieL 23.12.2010, 12:00 |
| непонятны 2 момента: 1. для чего первый template, содержаций apply-templates? Без него вроде все работает. 2. в чем разница между name(.) и name(), возвращается одно и тоже. |
| Автор: cat512 23.12.2010, 15:11 |
| 1 Да, всё будет работать и без него с такой структурой одноуровнего дерева. Но если у тебя в будующем структура файла изменится, и появятся вложенные узлы, то этот скрипт будет отрабатывать корректно, для всего дерева, а твой "модифицированный", только для узлов первого уровня 2 В данном случае, разница в читабельности, особенно, такой синтаксис актуален для громадных скриптов, где можно легко запутаться, поскольку в некоторых случаях "контекст текущего узла", с точки зрения пользователя, может существенно отличаться от контекста, с точки зрения xsl-процессора. |
| Автор: NieL 23.12.2010, 15:41 |
| thx за разъяснение. Еще хочу прояснить для себя: 1. если мне к примеру нужно проверять и корневой узел (upd), он условно то же имеет атрибуты from_ver и from_to, то как будет выглядеть скрипт? 2. xsl:copy-of как я понимаю копирует узел со всем его содержимым, а что если скажем мне нужно скопировать ветку только с определенными атрибутами, для этого нужно юзать xsl:copy? Как указать список атрибутов которые должны попасть в результирующий список? P.S. Думаю если разберусь с этими вопросвми можно будет ставить точку по тему. |
| Автор: cat512 23.12.2010, 20:11 | ||||||||||
| 1 Можно в рамках одного! Можешь просто добавить соответствующее условие выборки в шаблон соответствия корневому узлу, а можешь например написать единственный рекурсивный шаблон, что типа такого:
2 ну ты можешь сам (прямым тектом)формировать нужные аттрибуты, а можешьс помощью функций и xpat копировать существующие. Ну например: нужно тебе добавить в результирующее дерево новый узел:
тогда ты можешь прямым текстом в xsl скрипте добавить
либо скопировать нужные аттрибуты конструкцией
либо создать новый и скопировать значение старого конструкциями
3 Просто <xsl:copy> отличается от <xsl:copy-of> тем что эта функция одноранговая, т.е. она копирует только контекстный узел, без вложенных узлов. |