Преобразование идентичности - это преобразование данных , при котором исходные данные копируются в данные назначения без изменений.
Преобразование идентичности считается важным процессом при создании многоразовой библиотеки преобразований . Создав библиотеку вариантов преобразования базовой идентичности, можно легко поддерживать множество фильтров преобразования данных . Эти фильтры могут быть объединены в цепочку в формате, аналогичном конвейерам оболочки UNIX .
Примеры рекурсивных преобразований
«Копирование с рекурсией» позволяет, изменяя небольшие части кода, производить совершенно новый и другой вывод, фильтруя или обновляя ввод. Понимая «идентичность посредством рекурсии», мы можем понять фильтры.
Использование XSLT
Наиболее часто цитируемым примером преобразования идентичности (для XSLT версии 1.0) является преобразование «copy.xsl», выраженное в XSLT . Это преобразование использует команду xsl: copy [1] для выполнения преобразования идентификатора:
version = "1.0" xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" > match = "@ * | node ()" > select = "@ * | node ()" />
Этот шаблон работает, сопоставляя все атрибуты ( @ * ) и другие узлы ( node () ), копируя каждый сопоставленный узел, а затем применяя преобразование идентичности ко всем атрибутам и дочерним узлам контекстного узла. Это рекурсивно спускается по дереву элементов и выводит все структуры в той же структуре, что и в исходном файле, в пределах ограничений, касающихся того, какая информация считается важной в модели данных XPath . Поскольку node () соответствует тексту, инструкциям по обработке, корню и комментариям, а также элементам, копируются все узлы XML.
Более явная версия преобразования идентичности:
version = "1.0" xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" > match = "@ * | * | инструкция по обработке () | комментарий () " > select = " * | @ * | text () | processing -struction () | comment () " />
Эта версия эквивалентна первой, но явно перечисляет типы узлов XML, которые она будет копировать. Обе версии копируют данные, которые не нужны для большинства случаев использования XML (например, комментарии).
XSLT 3.0
XSLT 3.0 [2] определяет атрибут «при отсутствии совпадения» инструкции xsl: mode, который позволяет объявлять преобразование идентичности, а не реализовывать его как явное правило шаблона. Конкретно:
version = "3.0" xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" > on-no-match = "shallow-copy" />
по существу эквивалентен более ранним правилам шаблона. Подробности см. В описании мелкого копирования в стандарте XSLT 3.0 [3] .
Наконец, обратите внимание, что детали разметки, такие как использование разделов CDATA или порядок атрибутов, не обязательно сохраняются в выходных данных, поскольку эта информация не является частью модели данных XPath . Чтобы отобразить разметку CDATA в выходных данных, таблица стилей XSLT, содержащая шаблон преобразования идентичности (а не сам шаблон преобразования идентичности), должна использовать атрибут xsl: output, называемый cdata-section-elements .
cdata-section-elements задает список имен элементов, чьи дочерние текстовые узлы должны выводиться с использованием разделов CDATA. [1] Например:
method = "xml" encoding = "utf-8" cdata-section-elements = "element-name-1 element-name-2" />
Использование XQuery
XQuery может определять рекурсивные функции. В следующем примере функция XQuery копирует ввод непосредственно в вывод без изменений.
объявить функцию local: copy ( $ element as element ()) { element { node-name ( $ element )} { $ element / @ * , для $ child в $ element / node () return if ( $ child instance of element ( )) then local: copy ( $ child ) else $ child } };
Та же функция может быть достигнута с помощью преобразования в стиле машинного переключателя.
xquery версии "1.0" ;(: копировать ввод в вывод без изменений :) объявить функцию local: copy ( $ input as item () * ) as item () * { для $ node в $ input return typeswitch ( $ node ) case element () return element () { имя ( $ node )} { (: вывести каждый атрибут в этом элементе :) для $ att в $ node / @ * return attribute { name ( $ att )} { $ att } , (: вывести все подэлементы этого элемента рекурсивно :) для $ child в $ node return local: copy ( $ child / node ()) } (: в противном случае передать его. Используется для текста (), комментариев и PI :) по умолчанию return $ node };
Преобразование переключателя типов иногда предпочтительнее, поскольку его можно легко изменить, просто добавив оператор case для любого элемента, который требует специальной обработки.
Нерекурсивные преобразования
Два простых и наглядных преобразования типа «копировать все».
Использование XSLT
version = "1.0" xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" > match = "/" > select = " . " />
Использование XProc
name = "pipeline" xmlns: p = "http://www.w3.org/ns/xproc" >
Здесь одно важное замечание об идентичности XProc заключается в том, что он может принимать в качестве входных данных либо один документ, подобный этому примеру, либо последовательность документов.
Более сложные примеры
Обычно преобразование идентичности используется в качестве основы, на которой можно вносить локальные изменения.
Удалить преобразование именованного элемента
Использование XSLT
Преобразование идентичности можно изменить, чтобы скопировать все из входного дерева в выходное дерево, кроме заданного узла. Например, следующее скопирует все от ввода до вывода, кроме номера социального страхования:
match = "@ * | node ()" > select = "@ * | node ()" /> match = "PersonSSNID" />
Использование XQuery
объявить функцию local: copy-filter-elements ( $ element как element (), $ element-name как xs: string * ) как element () { element { node-name ( $ element ) } { $ element / @ * , для $ child в $ element / node () [ not ( name (.) = $ element-name )] возвращает if ( $ child instance of element ()) then local: copy-filter-elements ( $ child , $ element-name ) else $ child } };
Чтобы назвать это, нужно добавить:
$ filter -output : = local: copy-filter-elements ( $ input , 'PersonSSNID' )
Использование XProc
name = "pipeline" xmlns: p = "http://www.w3.org/ns/xproc" > match = "PersonSSNID" />
Смотрите также
дальнейшее чтение
- XSLT Cookbook , O'Reilly Media, Inc., 1 декабря 2002 г., Сэл Мангано, ISBN 0-596-00372-2
- Присцилла Уолмсли, XQuery , O'Reilly Media, Inc., Глава 8 Функции - Рекурсивные функции - стр. 109