|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
Есть таблица, она размещена в теге lines, строки таблицы - каждая строка в теге line. Есть список полей fields, в каждом теге field размещено имя поля Хочу вывести эту таблицу в браузер. Написал такое XSLT - преобразование. <xsl:for-each select="//lines/line"> <tr bgcolor="#FFEFF0"> <xsl:for-each select="//fields/field"> <td><xsl:value-of select="."/></td> </xsl:for-each> </tr> </xsl:for-each> 1. Как работать с вложенными циклами в XSLT? 2. Как написать выражение вместо value-of select="." чтобы выводилось не имя поля, а значение поля? Попробовал с переменными, но все равно не понял, как получить значение поля /$CurrField в строке $CurrLine: <xsl:for-each select="//lines/line"> <xsl:sort order="ascending" select="categories"/> <xsl:variable name="CurrLine"><xsl:value-of select="."/></xsl:variable> <xsl:for-each select="//fields/field"> <xsl:variable name="CurrField"><xsl:value-of select="."/></xsl:variable> <td>AAA<xsl:value-of select="."/> <xsl:value-of select="$CurrLine/$CurrField"/> </td> </xsl:for-each> </tr> </xsl:for-each> http://www.forum.mista.ru/topic.php?id=259325 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2007, 18:33 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
Исходный XML можно в студию? А то непонятно чем имя поля от значения поля отличается. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2007, 19:46 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
andrushokИсходный XML можно в студию? А то непонятно чем имя поля от значения поля отличается. Ну примерно так: <root> <lines> <line> <name>vasya</name> <id>11</id> <line> <line> <name>petya</name> <id>12</id> <line> <lines> <fields> <field>id</field> <field>name</field> </fields> </root> ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2007, 19:49 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
Так, насклько я въехал - fields, это заголовки, а lines - это даные. Тады и без циклов можно ... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
Можно, конечно и проще было (не лепить template на кажный тег), но так по крайней мере наглядно. И дальше развивать легко ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2007, 20:24 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
че то если честно, ничего не понял. Может все же скажете, как с циклом. Нужно то всего разыменование адреса сделать: $CurrLine/$CurrField ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2007, 20:46 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
Я тут пообедал и до меня дошло, что тебе хочется страннго . Типа как написать программу скажем на С, такую, чтоб она сама код себе написала, скомпилила, залинковала и выполнила. Задачка тетеритически выполнимая, но очень трахучая. Так вот, как до меня доперло, в fields ты описываешь поля (теги), которые потом хочешь использовать в selectaх как параметры. Архитектура неверная по определению. Схема любого XML задается жестко (и валидируется - DTD, XSD там всякие). Потом только можно плясать с XSLT. А у тебя получается, что данные в твоем XML определяют его структуру. Это не верно. Советую немного еще почитать про XML, что бы понять, как это должно быть. Также советую взлянуть на то что я наваял - как табличку выводить. Пригодиться. И еще - циклы в XSLT очень редки и ползоваться ими надо осторожно - они "сбивают" текущий узел. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.03.2007, 22:38 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
andrushokЯ тут пообедал и до меня дошло, что тебе хочется страннго . Типа как написать программу скажем на С, такую, чтоб она сама код себе написала, скомпилила, залинковала и выполнила. Задачка тетеритически выполнимая, но очень трахучая. Так вот, как до меня доперло, в fields ты описываешь поля (теги), которые потом хочешь использовать в selectaх как параметры. Архитектура неверная по определению. Схема любого XML задается жестко (и валидируется - DTD, XSD там всякие). Потом только можно плясать с XSLT. А у тебя получается, что данные в твоем XML определяют его структуру. Это не верно. Советую немного еще почитать про XML, что бы понять, как это должно быть. Также советую взлянуть на то что я наваял - как табличку выводить. Пригодиться. И еще - циклы в XSLT очень редки и ползоваться ими надо осторожно - они "сбивают" текущий узел. андрюшок, может не надо из пушки по воробьям? Давай конкретно - есть такая схема XML (без проверок DTD & etc). Нужна простенькая схема для ее вывода. В принципе, в книжках есть примеры именно такого рода (так что про то, что мне надо изучать XML - гон, скорее XSLT), но эти примеры пока не могу понять. Вот у меня был конкретный вопрос: Если в переменной $CurrLine текущая строка <line> А в переменной $CurrField имя текущего поля, например name То как мне получить значение line/name? <xsl:value-of select="$CurrLine/$CurrField"/> не проходят. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2007, 18:59 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
Fixin ... Вот у меня был конкретный вопрос: Если в переменной $CurrLine текущая строка <line> А в переменной $CurrField имя текущего поля, например name То как мне получить значение line/name? <xsl:value-of select="$CurrLine/$CurrField"/> не проходят. Не получиться. Потому что XSLT считает схему обрабатываемого XML жесткой (что и должно быть). Я собственно уже предлогал выход из этой ситуации. Добавить в каждый тег атрибут tagid (просто имя тега и пробовать что-то типа <xsl:value-of select="*[@tagid='$CurrLine']/*[@tagid='$CurrField']"/> Если очень хочется ... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2007, 19:21 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
andrushok Fixin ... Вот у меня был конкретный вопрос: Если в переменной $CurrLine текущая строка <line> А в переменной $CurrField имя текущего поля, например name То как мне получить значение line/name? <xsl:value-of select="$CurrLine/$CurrField"/> не проходят. Не получиться. Потому что XSLT считает схему обрабатываемого XML жесткой (что и должно быть). Я собственно уже предлогал выход из этой ситуации. Добавить в каждый тег атрибут tagid (просто имя тега и пробовать что-то типа <xsl:value-of select="*[@tagid='$CurrLine']/*[@tagid='$CurrField']"/> Если очень хочется ... Андрюшок, извини конечно, но ты не прав, не пугай новичков тем, что в xslt что то там невозможно. Вот тебе пример, где все возможно, я таки победил его. Я пишу небольшую приблуду, которая делает запрос к Outlook, данные получает в виде плоской таблицы в формате XML и преобразовывает результат в HTML с помощью шаблона XSLT. Так как состав колонок таблицы-результата может быть различным, в XML я также помещаю список колонок. Я обращался за помощью на sql.ru но там не посоветовали ничего толкового, один товарищ даже сказал, что такое невозможно, тем не менее, в книге "XSLT CookBook" я нашел похожий пример и творчески использовал его для своего случая. Немного замечаний по xslt-шаблону: = Для украшения таблицы используется чередование цвета строк (position() mod 2=0) = В переменной CurrLine хранится текущая строка. = В переменной CurrField хранится имя текущей колонки. = Xpath запрос $CurrLine/*[local-name( )=$CurrField] означает выбрать все подчиненные узлы из списка узлов в переменной CurrLine, имя которых равно значению переменной CurrField. = В коде два цикла по полям - первый для вывода шапки, второй по строкам таблицы. = Описания полей находятся по пути //info/fields, здесь //указывает, что адрес относительный а не абсолютный Вот xslt-шаблон, который преобразует мой XML в таблицу: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <table border="1"> <tr bgcolor="#CCCCCC"> <xsl:for-each select="//info/fields/*"> <td align="center"><strong><xsl:value-of select="name"/></strong></td> </xsl:for-each> </tr> <xsl:for-each select="//lines/line"> <xsl:sort order="ascending" select="categories"/> <tr bgcolor="#FFEFF0"> <xsl:if test="position() mod 2=0"> <xsl:attribute name="bgcolor">#CCCCCC</xsl:attribute> </xsl:if> <xsl:variable name="CurrLine" select="."/> <xsl:for-each select="//info/fields/*"> <xsl:variable name="CurrField"><xsl:value-of select="name"/></xsl:variable> <td><xsl:value-of select="$CurrLine/*[local-name( )=$CurrField]"/></td> </xsl:for-each> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> Исходный XML: <?xml version="1.0" encoding="windows-1251"?> <?xml-stylesheet type='text/xsl' href='xsl test.xml'?> <root> <lines> <line> <name type="S" sort="Иван Иванович">Иван Иванович</name> <categories type="S" sort="руководители">руководители</categories> <entryid type="S">000000009E5D45D68B62C44E8386C937DE30D92684852B00</entryid> <class type="U">40</class> </line> <line> <name type="S" sort="Елена Прекрасная">Елена Прекрасная</name> <categories type="S" sort="девушки">девушки</categories> <entryid type="S">000000009E5D45D68B62C44E8386C937DE30D926A4852B00</entryid> <class type="U">40</class> </line> <line> <name type="S" sort="Колька-ломщик">Колька-ломщик</name> <categories type="S" sort="криминал">криминал</categories> <entryid type="S">000000009E5D45D68B62C44E8386C937DE30D926C4852B00</entryid> <class type="U">40</class> </line> <line> <name type="S" sort="Кузьмич">Кузьмич</name> <categories type="S" sort="быт">быт</categories> <entryid type="S">000000009E5D45D68B62C44E8386C937DE30D926E4852B00</entryid> <class type="U">40</class> </line> <line> <name type="S" sort="Fixin">Fixin</name> <categories type="S" sort="я">я</categories> <entryid type="S">000000009E5D45D68B62C44E8386C937DE30D92604E74200</entryid> <class type="U">40</class> </line> <line> <name type="S" sort="Журнал Компьютерра">Журнал Компьютерра</name> <categories type="S" sort="пресса">пресса</categories> <entryid type="S">000000009E5D45D68B62C44E8386C937DE30D92624E74200</entryid> <class type="U">40</class> </line> </lines> <fields/> <info> <fields> <_0> <name type="S">name</name> <src type="S">FileAs</src> </_0> <_1> <name type="S">categories</name> <src type="S">Categories</src> </_1> </fields> </info> </root> ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2007, 18:23 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2007, 17:19 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
maXmo Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Ну и к чему это?? Можно и так, какая разница, метода одна. ;-) Не любишь переменные создавать? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2007, 20:31 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
У меня типо вопрос: если у меня есть xml-ка её можно преобразовать в хтмл-код и каким образом...впадло отвечать на столь простой вопрос, буду рад просто ссылкам на инфу... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2007, 18:50 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
IoptУ меня типо вопрос: если у меня есть xml-ка её можно преобразовать в хтмл-код и каким образом...впадло отвечать на столь простой вопрос, буду рад просто ссылкам на инфу... Ужазз!! до чего дожили. Если тебе надо чтобы xml стал html, по идеи у тебя в xml должны содержаться теги html. xml (все равночто в ней) 1.Ну можешь написать xsl преобразование... Потом запускать одно относительно другого, 2. Если влом ставить парсеры, IE m$ имеет встроенный в себя парсер, тогда в xml в верху напишешь <?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="../../../style/function.xsl" ?> То что помечено красным надо заменить на какой выходной тип и чем преобразовывать (:) xsl все равно писать придется) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2007, 11:17 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
Ioptвпадло отвечать на столь простой вопрос, буду рад просто ссылкам на инфу...сколько угодно http://www.w3.org/TR/xslt ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2007, 12:10 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
maXmo Ioptвпадло отвечать на столь простой вопрос, буду рад просто ссылкам на инфу...сколько угодно http://www.w3.org/TR/xslt если тебя интересует по джава скрипт, то вот: Леонов Игорь Васильевич XSLT для начинающих JavaScript и XML Объединим теперь наши знания XML с возможностями, которые нам предоставляет JavaScript. Предположим, что нам нужно иметь возможность динамически изменять сортировку столбцов таблицы при щелчке на заголовке того или иного столбца. Понятно, что для этого нам нужно иметь один XML-файл, содержащий строки таблицы, несколько XSL-файлов, каждый из которых содержит требуемую сортировку и нечто, что объединит это все вместе и заставит работать. Перейдем к реализации этой программы. В качестве XML-файла возьмем привычный нам файл со списком собак - ex05-1.xml. Обратите внимание - мы убрали из файла ссылку на XSL-файл - нам нужно менять шаблон преобразования динамически. Создадим также три XSL-файла, в каждом из которых у нас будет свой элемент xsl:sort, задающий сортировку строк - ex05-1a.xsl, ex05-1b.xsl, ex05-1c.xsl. Приведем здесь текст элемента xsl:sort для каждого файла <xsl:sort order="ascending" select="dogName"/> <xsl:sort order="ascending" select="number(dogWeight)" data-type="number"/> <xsl:sort order="ascending" select="dogColor"/> Теперь нам осталось только объединить все это вместе. Ниже мы полностью приводим текст файла ex05-1.htm, сопроводив его необходимыми комментариями. <html> <head> <script language="JavaScript"> var source; var style; Функция инициализации необходимых объектов. В этой же функции выводится первоначальный вариант на экран. function init() { Создаем объект для файла - источника данных. source = new ActiveXObject("Microsoft.XMLDOM"); source.async = false; Создаем объект для файла с шаблоном преобразования (для файла стиля). style = new ActiveXObject("Microsoft.XMLDOM"); style.async = false; Загружаем записи в файл - источник данных.Записи берем из существующего XML-файла. source.load("ex05-1.xml"); Загружаем файл стиля. Первоначальная сортировка - по цвету. style.load("ex05-1a.xsl"); Теперь нам нужно вывести информацию на экран. Внимательно проанализируйте синтаксис и запомните его. document.all.item("xslresult").innerHTML = source.transformNode(style); return true; } Сортируем записи по кличке. function orderByNick() { style.load("ex05-1a.xsl"); document.all.item("xslresult").innerHTML = source.transformNode(style); return true; } Сортируем записи по весу. function orderByWeight() { style.load("ex05-1b.xsl"); document.all.item("xslresult").innerHTML = source.transformNode(style); return true; } Сортируем записи по цвету. function orderByColor() { style.load("ex05-1c.xsl"); document.all.item("xslresult").innerHTML = source.transformNode(style); return true; } </script> </head> При загрузке страницы создадим все необходимые объекты и выведем первоначальный вариант на экран. <body onLoad="init()"> <div id="xslresult"> <!-- Здесь будет размещаться окончательный вариант HTML-содержимого --> </div> </body> </html> Мы добились своей цели - при щелчке мышью на заголовке столбца строки сортируются в соответствии со значениями в выбранном столбце. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2007, 22:29 |
|
Вопрос по XSLT-преобразованию
|
|||
---|---|---|---|
#18+
Вопрос про вложенные циклы в XSLT. Нужно сделать так <xsl:for-each select = "report_head">... данные1 <xsl:for-aech select = "../info> данные2 </xsl:for-aech> данные3 </xsl:for-aech> данные 1 и 2 выводятся, данные3 - нет, даже если часть данные3 - не содержит данных, а только некоторые строковые константы. Структура xml <Report> <report_head></report_head> <info></info> <info></info> <info></info> </Report> если это связано с переходом на другой узел во внутреннем цикле, то как вернуться обратно после окончания внутреннего цикла? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 17:15 |
|
|
start [/forum/topic.php?fid=14&fpage=26&tid=1332851]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
120ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 216ms |
0 / 0 |