| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > XML, XSL > XSLT |
| Автор: Luc1fer 3.11.2004, 15:51 |
| Народ, каким образом можно написать XSLT шаблон, чтобы сымулировать команду include. Т. е.: Есть xml файл <?xml version="1.0" encoding="windows-1251"?> <Root xmlns:xpl="http://www.itslab.niks.by"> <c>Привет</c> <d> <xpl:include select="../../c" </d> </Root> На этот файл нужно наложить такой шаблон, чтобы выходной файл выглядел след образом: <Root xmlns:xpl="http://www.itslab.niks.by"> <c>Привет</c> <d> <c>Привет</c> </d> </Root> Моя идея: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="include"> <xsl:value-of select="@select"/> - только как сделать, чтобы в value-of попадало именно значение @select????????? </xsl:template> </xsl:stylesheet> |
| Автор: 3,14 4.11.2004, 10:07 | ||
Не подойдёт? |
| Автор: Ignat 4.11.2004, 10:11 | ||
Похоже нет. У меня первая мысль тоже была - импорт шаблона. А человеку, видимо, хочется чтобы можно было вставить узел того же дерева, но из параллельной ветви. Правда, зачем это нужно, я так и не понял. |
| Автор: 3,14 5.11.2004, 13:10 | ||
Тады xsl:copy юзать нуно |
| Автор: Ignat 5.11.2004, 16:05 | ||
|
| Автор: 3,14 6.11.2004, 02:50 | ||||||
Возьмём XML:
Чтоб скопировать из него содержимое ноды с ключом 2 применим XSL:
И как результат получим:
|
| Автор: Luc1fer 25.11.2004, 15:31 |
| Енто все ясно. Мне нужно, чтоб шаблон распознал мою команду, например <xpl:include select="../../c"/> взял атрибут select и вставил на место этой команды то, что он выбрал в select |
| Автор: 3,14 25.11.2004, 15:41 |
| ../../c - это файл или node текущего документа? |
| Автор: Luc1fer 25.11.2004, 17:13 |
| вообще-то узел, но в принципе должно выбирать из файла список узлов, аля dociment("1.txt")/Root |
| Автор: Ignat 25.11.2004, 17:27 | ||||||||
| Luc1fer, объясните, пожалуйста, понятнее. Если
если же
Если предложенные варианты не подходят, то расскажите чего именно нужно добиться. |
| Автор: Luc1fer 25.11.2004, 17:52 | ||
| Попробую) Итак, есть xml документ, в котором встречается тег - <xpl:include> <Select>/Root/1</Select> <File>1.xml</File> <Directory>c:/1/</Directory> </xpl:include> После обработки файла с этой командой вместо нее должно стоять то, что выберет XPath из c:/1/1.xml Мой вариант для простого включения файла:
Изврат еще и в том, что в подключаемом файле может также находиться <xpl:include>)) В этом варианте весь вопрос в том, как к document(concat(Directory/text(),"/",File/text())) еще приклеить значение select. Так нельзя - concat(document(concat(Directory/text(),"/", File/text())), select/text()) Так проблема с незнаючем <xsl:apply-templates select="concat( 'document(' ,Directory/text(), '/' , File/text(),')' )"/> |
| Автор: 3,14 26.11.2004, 14:43 |
| Всё равно не понял чем этот вариант отличается от обычного включения файла, запости какой-нибудб пример исходных данных и того что должно получится |
| Автор: Luc1fer 29.11.2004, 11:30 |
| Хорошо пример Файл 1.xml <?xml version="1.0" encoding="windows-1251"?> <?xml-stylesheet type="text/xsl" href="test.xsl"?> <Root xmlns:xpl="http://www.itslab.niks.by"> <xpl:include> <Directory>c/myDir</Directory> <File>2.xml</File> <Select>/Root/car</Select> </xpl:include> </Root> Файл 2.xml <?xml version="1.0" encoding="windows-1251"?> <Root xmlns:xpl="http://www.itslab.niks.by"> <car> <xpl:include> <Directory>c/myDir</Directory> <File>3.xml</File> <Select>/Root/car</Select> </xpl:include> </car> </Root> Файл 3.xml <?xml version="1.0" encoding="windows-1251"?> <Root xmlns:xpl="http://www.itslab.niks.by"> <car> BMW <Color>Blue</Color> </car> </Root> После обработки 1.xml получим: <Root xmlns:xpl="http://www.itslab.niks.by"> <car> <car> BMW <Color>Blue</Color> </car> </car> </Root> Вот так |
| Автор: 3,14 30.11.2004, 14:54 | ||||||||
| Однако попотеть пришлось, вот пример там немного менять нужно: test.xml:
test2.xml:
test.xsl:
И результат:
А зачем такое нуно если не секрет? |
| Автор: Luc1fer 1.12.2004, 11:40 | ||||||
| Очень просто). Я пишу на Java, а в XSLT - полный дуб(вековой). Работаем над проектом, аля Semantic-web. Я занимаюсь написанием компилятора нового веб-языка)), если можно так сказать. Так вот в этом языке есть такая команда include - которая позволяет вставить в текущее место документа некоторый набор узлов. Меня попросили сделать тоже самое без Java или JavaScript, средствами XSL. Я дошел до
Но все портит эта строка -
Так я могу вставить файл. А как к этому еще присобачить, что из него выбрать??? Наткнулся, что
Не србатывает, и мысль ушла. |
| Автор: 3,14 2.12.2004, 10:44 | ||
У меня для этого используется template node_search, он рекурсивно обходит узлы документа, и если те соотвествуют критерию выбора, то он делает для них apply-templates, не знаю, может есть вариант и получше, но я такого не нашёл |
| Автор: Luc1fer 2.12.2004, 13:40 |
| А почему не срабатывает это <xsl:apply-templates select="document(File/text(),Select/text())"/> не подскажите? Хотя <xsl:apply-templates select="document(File/text(),"admin.xpl/Root")"/> Срабатывает??? Почему??? |
| Автор: 3,14 2.12.2004, 14:39 |
| А почему Select/text(), а не просто Select? |