Главная » XSLT » Выполнение запросов, сохраняющих структуру

0

Задача

В ответ на запрос к XML-документу требуется получить ответ, структура ко­торого идентична структуре исходного документа.

Решение

Запросы, сохраняющие структуру, отфильтровывают ненужную информа­цию, сохраняя структуру документа практически неизменной. Степень схожести структуры входного и выходного документа и есть метрика, определяющая при­менимость данного рецепта. Чем она больше, тем выше применимость.

В следующем примере есть два компонента: один можно использовать повторно, а другой зависит от конкретного приложения. Повторное использование допускает таблица стилей, которая копирует все узлы в выходной документ (тождественное пре­образование). Эта таблица, показанная в примере 9.9, широко применялась в главе 6.

Пример 9.9. copy.xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="node() | @*"> <xsl:copy>

<xsl:apply-templates select="@* | node()"/> </xsl:copy>

</xsl:template>

</xsl:stylesheet>

Другой компонент – это таблица стилей, которая импортирует copy.xslt и со­держит правила, переопределяющие поведение по умолчанию. Так, следующая таблица стилей порождает файл, аналогичный people.xml, в котором оставлены только курящие женщины.

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns :xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="copy.xslt"/>

<!– Схлопнуть дыры, оставшиеся после удаления элементов person –> <xsl:strip-space elements="people"/>

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<!– Применить поведение по умолчанию, то есть копирование –> <xsl:apply-imports/> </xsl:template>

<!– Игнорировать прочих людей –> <xsl:template match="person"/>

</xsl:stylesheet>

Вместо этого можно написать единственный шаблон, который сопоставляет­ся с теми элементами, которые нужно исключить, не применяя к ним никаких действий:

<xsl:template match="person[@sex != ‘f’ or @smoker != ‘yes’]" />

Обсуждение

Этот пример полезен тем, что позволяет сохранить структуру XML-докумен- та, ничего не зная о том, какова эта структура. Нужно лишь знать, какие элементы следует отфильтровать, и понимать, что это можно сделать с помощью шаблонов.

Этот способ применим в таких контекстах, которые мало кто назвал бы запро­сами. Предположим, например, что нужно клонировать документ, заменив все ат­рибуты sex атрибутами gender:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="copy.xslt"/>

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="@sex"> <xsl:attribute name="gender"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template>

</xsl:stylesheet>

Элегантность этого решения в том, что оно работает для любого XML-доку- мента вне зависимости от схемы. Если в документе есть элементы с атрибутом sex, он будет заменен на gender.

А сможете догадаться, что делает этот код?1

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:import href="copy.xslt"/>

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="@sex"> <xsl:attribute name="gender">

<xsl:value-of select="."/> </xsl:attribute> <xsl:apply-imports/> </xsl:template>

</xsl:stylesheet>

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии