Jump to content

Преобразование личности

Преобразование идентичности это преобразование данных , которое копирует исходные данные в целевые данные без изменений.

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

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

[ редактировать ]

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

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

[ редактировать ]

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

<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> 

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

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

<xsl:stylesheet   version=  "1.0"   xmlns:xsl=  "http://www.w3.org/1999/XSL/Transform"  >    <xsl:template   match=  "@*|*|processing-instruction()|comment ()"  >      <xsl:copy>        <xsl:apply-templates   select=  "*|@*|text()|processing-instruction()|comment()"  />      </xsl:copy>    </xsl:template >  </xsl:таблица стилей> 

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

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

<xsl:stylesheet   version=  "3.0"   xmlns:xsl=  "http://www.w3.org/1999/XSL/Transform"  >    <xsl:mode   on-no-match=  "shallow-copy"   />  </ xsl:таблица стилей> 

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

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

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

<xsl:output   метод =  "xml"   кодирование =  "utf-8"   cdata-section-elements =  "имя-элемента-1 имя-элемента-2"  /> 

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

[ редактировать ]

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

объявить   функцию   local:copy  (  $  element   as   element  ())   {    element   {  имя-узла  (  $  element  }      {  $  element  /  @*  ,       for   $  child   в   $  element  /  node  ()          return   if   (  $  дочерний   экземпляр   элемента   (  )  ))            затем   local:copy  (  $  child  )            else   $  child      }  }; 

Той же функции можно добиться, используя преобразование в стиле typeswitch.

 xquery  версия   «1.0»  ;  (: скопировать ввод в вывод без изменений :)  объявить   функцию   local:copy  (  $  input   as   item  ()  *  )   as   item  ()  *   {  for   $  node   in   $  input     return         typeswitch  (  $  node  )          case   document-node  ()             return                document   {                  local:copy  (  $  node  /  node  ())                }          case   element  ()             return                element   {  name  (  $  node  )}   {                  (: вывести каждый атрибут в этом элементе :)                  для   $  att   in   $  node  /  @*                     return                        атрибут   {  name  (  $  att  )}   {  $  att  }                  ,                  (: выведите все подэлементы этого элемента рекурсивно :)                  for   $  child   in   $  node                     return   local:copy  (  $  child  /  node  ())                }          (: иначе передайте его Through Используется для text(), комментариев и PI :)          default   return   $  node  }; 

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

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

[ редактировать ]

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

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

[ редактировать ]
<xsl:stylesheet   version=  "1.0"   xmlns:xsl=  "http://www.w3.org/1999/XSL/Transform"  >    <xsl:template   match=  "/"  >      <xsl:copy-of   select=  " ."  />    </xsl:template>  </xsl:stylesheet> 

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

[ редактировать ]
<p:pipeline   name=  "pipeline"   xmlns:p=  "http://www.w3.org/ns/xproc"  >    <p:identity/>  </p:pipeline> 

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

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

[ редактировать ]

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

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

[ редактировать ]

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

[ редактировать ]

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

  <xsl:template   match=  "@*|node()"  >      <xsl:copy>        <xsl:apply-templates   select=  "@*|node()"  />      </xsl:copy>    </xsl:template>    <!-- удалить все номера социального страхования -->    <xsl:template   match=  "PersonSSNID"  /> 

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

[ редактировать ]
 объявить   функцию   local:copy-filter-elements  (  $  element   as   element  (),      $  element-name   as   xs:string  *  )   as   element  ()   {     element   {  имя-узла  (  $  element  )   }               {   $  element  /  @*  ,                 for   $  child   in   $  element  /  node  ()[  not  (  name  (.)  =  $  -name  )]                    return   if   (  $  дочерний   экземпляр   элемента   element  ())                      then   local:copy-filter-elements  (  $  child  ,  $  element-name  )                      еще   $  ребенок             }   }; 

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

$  filtered-output   :=   local:copy-filter-elements  (  $  input  ,   'PersonSSNID'  ) 

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

[ редактировать ]
<p:pipeline   name=  "pipeline"   xmlns:p=  "http://www.w3.org/ns/xproc"  >    <p:identity/>    <p:delete   match=  "PersonSSNID"  />  </p: трубопровод> 

См. также

[ редактировать ]

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

[ редактировать ]
  • Поваренная книга XSLT , O'Reilly Media, Inc., 1 декабря 2002 г., Сал Мангано, ISBN   0-596-00372-2
  • Присцилла Уолмсли, XQuery , O'Reilly Media, Inc., Глава 8 Функции — Рекурсивные функции — страница 109
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 1dfbf1e8a6b001722938d128fabd1e61__1670291100
URL1:https://arc.ask3.ru/arc/aa/1d/61/1dfbf1e8a6b001722938d128fabd1e61.html
Заголовок, (Title) документа по адресу, URL1:
Identity transform - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)