пятница, 24 февраля 2012 г.

XML + XSLT. Управление визуальным отображением XML-документов.

Для того, чтобы автоматом преобразовывать содержимое xml-файлов в удобочитаемый вид/формат (html, rtf, pdf, txt, vrml, svg, java и т.д.) - следует воспользоваться XSLT, вместо того, чтобы стараться применить CSS.

Недостатки CSS:
1. CSS не может изменить порядок следования элементов в xml-документе. Если вы захотите отсортировать некоторые элементы или отфильтровать их по некоторому свойству, то CSS вам в этом однозначно не помощник.
2. CSS не выполняет вычисления. Если вы захотите вычислить и вывести значение(например, просуммировать числовые значения всех элементов в xml-документе), CSS вам не подойдёт.
3. CSS не может объединять документы. Если вы захотите объединить пару десятков xml-документов с заказами на покупку и напечатать сводку всех заказанных товаров, то CSS вам опять же не поможет.
Маленький пример использования XSL
Имеется некоторый xml-файл настроек плагина:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="styleSheet.xsl"?>
<document>
  <!--Краткое описание плагина-->
  <commonText>
    Плагин контролирует настройки слоёв чертежей AutoCAD. Ниже представлена таблица, в которой перечислены проверяемые позиции.
  </commonText>
  <!--Настройки плагина-->
  <settings>
    <variable>
      <name>Проверка имени слоя</name>
      <value>true</value>
      <description>Проверка имени слоя на соответствие правилу построения имён</description>
    </variable>
    <variable>
      <name>Проверка цвета слоя</name>
      <value>true</value>
      <description>Проверка на то, чтобы слою назначались цвета из палитры 'Index Color'</description>
    </variable>
    <variable>
      <name>Проверка типа линии</name>
      <value>true</value>
      <description>Проверка на то, чтобы слоям назначались типы линий только из определённого набора</description>
    </variable>
    <variable>
      <name>Проверка толщин линий</name>
      <value>true</value>
      <description>Проверка на то, чтобы слоям назначались толщины линий только из определённого набора</description>
    </variable>
    <variable>
      <name>Проверка наличия примечания</name>
      <value>true</value>
      <description>Каждый слой должен иметь примечание, расшифровывающее его назначение</description>
    </variable>
    <variable>
      <name>Фиксированный набор слоёв</name>
      <value>false</value>
      <description>Следует ли запретить пользователям создавать дополнительные слои, по установленным в Стандарте правилам</description>
    </variable>
  </settings>

Плагин должен считывать с него настройки и работать в соответствии с ними. В то же время должна присутствовать некая документация, которую бы юзер мог прочитать и понять. Причём материал, изложенный в документации должен соответствовать тем настройками, которые установлены в текущий момент. Для того, чтобы не держать в голове, что после того, как подправишь настройки, нужно лезть и править документацию, можно всё это представить в виде одного xml-файла. Плагин будет читать из него настройки, а юзер - открывать его в браузере и... видеть его в "человеческом" виде... Для этого создаём файл styleSheet.xsl с таким содержимым:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <html>
      <body>
        <h2>Настройки плагина</h2>
        <p>
          <xsl:value-of select="document/commonText"/>
        </p>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Параметр</th>
            <th>Значение</th>
            <th>Примечание</th>
          </tr>
          <xsl:for-each select="document/settings/variable">
            <tr>
              <td>
                <xsl:value-of select="name"/>
              </td>
              <td>
                <xsl:value-of select="value"/>
              </td>
              <td>
                <xsl:value-of select="description"/>
              </td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Теперь, если юзер в браузере откроет наш xml-файл, то он увидит не запутанный (с его точки зрения), неудобный xml-текст, а это (кликните мышью по изображению, чтобы увеличить его):

В данном примере я не показывал выборки, сортировки, фильтрации, различного рода операции и вычисления (они тут были не нужны), но при необходимости всё это можно делать средствами XSLT.

Комментариев нет: