WikiDer > Преобразование идентичности

Identity transform

В преобразование идентичности это преобразование данных который копирует исходные данные в данные назначения без изменений.

Преобразование идентичности считается важным процессом при создании многоразового библиотека преобразований. Создавая библиотеку вариантов преобразования базовой идентичности, фильтры преобразования данных легко обслуживается. Эти фильтры можно объединить в цепочку в формате, аналогичном UNIX трубы оболочки.

Примеры рекурсивных преобразований

«Копирование с рекурсией» позволяет, изменяя небольшие части кода, производить совершенно новый и другой вывод, фильтруя или обновляя ввод. Понимая «идентичность по рекурсии», мы можем понять фильтры.

Использование XSLT

Наиболее часто цитируемым примером преобразования идентичности (для XSLT версии 1.0) является преобразование copy.xsl, выраженное в XSLT. Это преобразование использует команду xsl: copy[1] для выполнения преобразования идентичности:

 версия ="1.0" xmlns: xsl ="http://www.w3.org/1999/XSL/Transform">   совпадение ="@ * | узел ()">    <xsl:copy>       выберите ="@ * | узел ()"/>    </xsl:copy>  </xsl:template></xsl:stylesheet>

Этот шаблон работает путем сопоставления всех атрибутов (@*) и другие узлы (узел()), копируя каждый совпавший узел, а затем применяя преобразование идентичности ко всем атрибутам и дочерним узлам контекстного узла. Это рекурсивно спускается по дереву элементов и выводит все структуры в той же структуре, что и в исходном файле, в пределах ограничений, касающихся того, какая информация считается важной в файле. Модель данных XPath. С узел() соответствует тексту, инструкциям по обработке, корню и комментариям, а также элементам, копируются все узлы XML.

Более явная версия преобразования идентичности:

 версия ="1.0" xmlns: xsl ="http://www.w3.org/1999/XSL/Transform">   совпадение ="@ * | * | инструкция по обработке () | комментарий ()">    <xsl:copy>       выберите ="* | @ * | текст () | инструкция по обработке () | комментарий ()"/>    </xsl:copy>  </xsl:template></xsl:stylesheet>

Эта версия эквивалентна первой, но явно перечисляет типы узлов XML, которые она будет копировать. Обе версии копируют данные, которые не нужны для большинства случаев использования XML (например, комментарии).

XSLT 3.0

XSLT 3.0[2] определяет атрибут «при отсутствии совпадения» инструкции xsl: mode, который позволяет объявить преобразование идентичности, а не реализовать его как явное правило шаблона. Конкретно:

 версия ="3.0" xmlns: xsl ="http://www.w3.org/1999/XSL/Transform">   on-no-match ="мелкая копия" /></xsl:stylesheet>

по существу эквивалентен более ранним правилам шаблона. См. Описание мелкого копирования в стандарте XSLT 3.0.[3] для подробностей.

Наконец, обратите внимание, что детали разметки, такие как использование разделов CDATA или порядок атрибутов, не обязательно сохраняются в выходных данных, поскольку эта информация не является частью Модель данных XPath. Чтобы отобразить разметку CDATA в выходных данных, таблица стилей XSLT, содержащая шаблон преобразования идентичности (нет сам шаблон преобразования идентичности) должен использовать xsl: вывод атрибут называется cdata-section-elements.

cdata-section-elements определяет список имен элементов, чьи дочерние текстовые узлы должны выводиться с использованием разделов CDATA.[1]Например:

 метод ="xml" кодировка =«УТФ-8» cdata-section-elements ="имя-элемента-1 имя-элемента-2"/>

Использование XQuery

XQuery может определять рекурсивные функции. В следующем примере функция XQuery копирует входные данные непосредственно в выходные без изменений.

объявить функция местный: копия($элемент в качестве элемент()) {  элемент {имя-узла($элемент)}    {$элемент/@*,     за $ребенок в $элемент/узел()        возвращаться если ($ребенок пример из элемент())          тогда местный: копия($ребенок)          еще $ребенок    }};

Та же функция может быть достигнута с помощью преобразования в стиле машинного переключателя.

xquery версия "1.0";(: копировать ввод в вывод без изменений :)объявить функция местный: копия($Вход в качестве элемент()*) в качестве элемент()* {за $узел в $Вход   возвращаться       машинка($узел)        дело элемент()           возвращаться              элемент {имя($узел)} {                (: вывести каждый атрибут в этом элементе :)                за $att в $узел/@*                   возвращаться                      атрибут {имя($att)} {$att}                ,                (: рекурсивно вывести все подэлементы этого элемента :)                за $ребенок в $узел                   возвращаться местный: копия($ребенок/узел())              }        (: в противном случае передать его. Используется для текста (), комментариев и PI :)        дефолт возвращаться $узел};

Преобразование переключателя типов иногда предпочтительнее, поскольку его можно легко изменить, просто добавив оператор case для любого элемента, который требует специальной обработки.

Нерекурсивные преобразования

Два простых и наглядных преобразования типа "копировать все".

Использование XSLT

 версия ="1.0" xmlns: xsl ="http://www.w3.org/1999/XSL/Transform">   совпадение ="/">     выберите ="."/>  </xsl:template></xsl:stylesheet>

Использование XProc

 имя ="трубопровод" xmlns: p ="http://www.w3.org/ns/xproc">  <p:identity/></p:pipeline>

Здесь одно важное замечание о XProc identity, состоит в том, что в качестве входных данных он может принимать либо один документ, подобный этому примеру, либо последовательность документов.

Более сложные примеры

Обычно преобразование идентичности используется в качестве основы, на которой можно вносить локальные изменения.

Удалить преобразование именованного элемента

Использование XSLT

Преобразование идентичности можно изменить, чтобы скопировать все из входного дерева в выходное дерево, кроме заданного узла. Например, следующее скопирует все от ввода до вывода, кроме номера социального страхования:

   совпадение ="@ * | узел ()">    <xsl:copy>       выберите ="@ * | узел ()"/>    </xsl:copy>  </xsl:template>  <!-- remove all social security numbers -->   совпадение ="PersonSSNID"/>

Использование XQuery

 объявить функция местные: копировать элементы фильтра($элемент в качестве элемент(),    $имя-элемента в качестве xs: строка*) в качестве элемент() {   элемент {имя-узла($элемент) }             { $элемент/@*,               за $ребенок в $элемент/узел()[нет(имя(.)=$имя-элемента)]                  возвращаться если ($ребенок пример из элемент())                    тогда местные: копировать элементы фильтра($ребенок,$имя-элемента)                    еще $ребенок           } };

Чтобы назвать это, нужно добавить:

$отфильтрованный вывод := местные: копировать элементы фильтра($Вход, 'PersonSSNID')

Использование XProc

 имя ="трубопровод" xmlns: p ="http://www.w3.org/ns/xproc">  <p:identity/>   совпадение ="PersonSSNID"/></p:pipeline>

Смотрите также

дальнейшее чтение

  • Поваренная книга XSLT, O'Reilly Media, Inc., 1 декабря 2002 г., Сэл Мангано, ISBN 0-596-00372-2
  • Присцилла Уолмсли, XQuery, O'Reilly Media, Inc., Глава 8 Функции - Рекурсивные функции - стр. 109

Рекомендации