Вывод произвольной xml-таблицы с помощью xslt-преобразования в HTML Ключевые слова: xml,xslt,html
Так как состав колонок таблицы-результата может быть различным, в 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>
|