powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Вопрос по XSLT-преобразованию
16 сообщений из 16, страница 1 из 1
Вопрос по XSLT-преобразованию
    #34381320
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица, она размещена в теге 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
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34381448
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходный XML можно в студию? А то непонятно чем имя поля от значения поля отличается.
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34381451
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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>
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34381485
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, насклько я въехал - 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.
<xsl:template match=".">
    <table ...>
    <xsl:apply-template select="fields">
    <xsl:apply-template select="lines">
    </table>
</xsl:template>

<xsl:template match="fields">
    <tr ...>
    <xsl:apply-template select="field">
    </tr>
</xsl:template>

<xsl:template match="field">
    <th ...>
    <xsl:value-of select=".">
    </th>
</xsl:template>

<xsl:template match="lines">
    <xsl:apply-template select="line">
</xsl:template>

<xsl:template match="line">
    <tr ...>
    <xsl:value-of select="id | name">
    </tr>
</xsl:template>

<xsl:template match="id">
    <td ...>
    <xsl:value-of select=".">
    </td>
</xsl:template>

<xsl:template match="name">
    <td ...>
    <xsl:value-of select=".">
    </td>
</xsl:template>

Можно, конечно и проще было (не лепить template на кажный тег), но так по крайней мере наглядно. И дальше развивать легко
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34381518
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
че то если честно, ничего не понял.
Может все же скажете, как с циклом.
Нужно то всего разыменование адреса сделать:
$CurrLine/$CurrField
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34381609
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут пообедал и до меня дошло, что тебе хочется страннго . Типа как написать программу скажем на С, такую, чтоб она сама код себе написала, скомпилила, залинковала и выполнила. Задачка тетеритически выполнимая, но очень трахучая.

Так вот, как до меня доперло, в fields ты описываешь поля (теги), которые потом хочешь использовать в selectaх как параметры. Архитектура неверная по определению. Схема любого XML задается жестко (и валидируется - DTD, XSD там всякие). Потом только можно плясать с XSLT. А у тебя получается, что данные в твоем XML определяют его структуру. Это не верно. Советую немного еще почитать про XML, что бы понять, как это должно быть. Также советую взлянуть на то что я наваял - как табличку выводить. Пригодиться. И еще - циклы в XSLT очень редки и ползоваться ими надо осторожно - они "сбивают" текущий узел.
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34388425
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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"/> не проходят.
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34388485
Фотография 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']"/>

Если очень хочется ...
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34391276
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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>
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34396780
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<xsl:for-each select="//lines/line">
<xsl:variable name="CurLine" select="."/>
<tr>
<xsl:for-each select="//fields/field">
<td><xsl:value-of select="$CurLine/*[local-name()=.]"/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34407228
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<xsl:for-each select="//lines/line">
<xsl:variable name="CurLine" select="."/>
<tr>
<xsl:for-each select="//fields/field">
<td><xsl:value-of select="$CurLine/*[local-name()=.]"/></td>
</xsl:for-each>
</tr>
</xsl:for-each>


Ну и к чему это??
Можно и так, какая разница, метода одна. ;-) Не любишь переменные создавать?
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34416605
Iopt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня типо вопрос: если у меня есть xml-ка её можно преобразовать в хтмл-код и каким образом...впадло отвечать на столь простой вопрос, буду рад просто ссылкам на инфу...
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34417665
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 все равно писать придется)
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34417839
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ioptвпадло отвечать на столь простой вопрос, буду рад просто ссылкам на инфу...сколько угодно http://www.w3.org/TR/xslt
...
Рейтинг: 0 / 0
Вопрос по XSLT-преобразованию
    #34423154
Fixin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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>

Мы добились своей цели - при щелчке мышью на заголовке столбца строки сортируются в соответствии со значениями в выбранном столбце.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вопрос по XSLT-преобразованию
    #37475970
Beglanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос про вложенные циклы в 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>

если это связано с переходом на другой узел во внутреннем цикле, то как вернуться обратно после окончания внутреннего цикла?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Вопрос по XSLT-преобразованию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]