Книга знаний

Инф. технологии

Вывод произвольной xml-таблицы с помощью xslt-преобразования в HTML

Я пишу небольшую приблуду, которая делает запрос к Outlook, данные получает в виде плоской таблицы в формате XML и преобразовывает результат в HTML с помощью шаблона XSLT. Автор статьи: Гений 1С | Редакторы: Волшебник
Последняя редакция №3 от 14.03.07 | История
URL: http://kb.mista.ru/article.php?id=499

Ключевые слова: xml,xslt,html


Так как состав колонок таблицы-результата может быть различным, в XML я также помещаю список колонок.
Я обращался за помощью на sql.ru но там не посоветовали ничего толкового, один товарищ даже сказал, что такое невозможно, тем не менее, в книге "XSLT CookBook" я нашел похожий пример и творчески использовал его для своего случая.

Немного замечаний по xslt-шаблону:
  1. Для украшения таблицы используется чередование цвета строк (position() mod 2=0)

  2. В переменной CurrLine хранится текущая строка.
  3. В переменной CurrField хранится имя текущей колонки.

  4. Xpath запрос $CurrLine/*[local-name( )=$CurrField] означает выбрать все подчиненные узлы из списка узлов в переменной CurrLine, имя которых равно значению переменной CurrField.
  5. В коде два цикла по полям - первый для вывода шапки, второй по строкам.

  6. Описания полей находятся по пути //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>

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2024 | Mista.ru

Яндекс.Метрика