Как выглядит документ XSL, если он отражает входные данные? - PullRequest
5 голосов
/ 17 апреля 2011

Типовое использование XSL:

XML1.xml -> *transformed using xsl* -> XML2.xml

Как выглядит документ XSL, если я хочу просто отразить входные данные?

ex:

XML1.xml -> *transformed using xsl* -> XML1.xml

Ответы [ 3 ]

8 голосов
/ 17 апреля 2011

Как выглядит документ XSL, если Я хочу просто отразить ввод данные

Существует более одного ответа на этот вопрос , однако все они могут быть названы «Identity Transform»:

  1. <xsl:copy-of select="/"/> Это самое короткое, простое, наиболее эффективное и наиболее негибкое, нерасширяемое и бесполезное преобразование идентичности.

  2. Классическое правило идентичности , которое каждый знает (или должен знать):

_

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

Это все еще очень короткое преобразование с одним шаблоном, которое является гораздо более расширяемым и полезным преобразованием идентичности, также известным как «правило идентичности». Использование и переопределение преобразования идентификаторов является наиболее фундаментальным и мощным шаблоном проектирования XSLT, позволяющим решать общие задачи копирования и замены / переименования / удаления / добавления всего за несколько строк. Возможно, 90% + всех ответов в теге xslt используют эту форму преобразования идентификаторов.

0,3. Правило тонкой детерминации управления , которое должен знать каждый (и мало кто знает):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()[1]"/>
  </xsl:copy>
  <xsl:apply-templates select="following-sibling::node()[1]"/>
 </xsl:template>
</xsl:stylesheet>

Это похоже на общеизвестное правило идентификации, определенное в 2. выше, но оно обеспечивает более точное управление обработкой XSLT.

Обычно с 2. <xsl:apply-templates select="@*|node()"> запускает ряд преобразований (для всех атрибутов и дочерних узлов), которые могут быть выполнены в любом порядке или даже параллельно. Существуют задачи, в которых мы не хотим, чтобы определенные типы узлов обрабатывались после некоторых других узлов, поэтому мы должны устранить утечку правила идентификации, заменив его пустыми шаблонами, соответствующими нежелательным узлам, и добавив другие шаблоны в определенном режиме. обрабатывать эти узлы "когда придет время" ...

0,3. больше подходит для задач, где мы хотим больше контроля и действительно последовательной обработки. Некоторые задачи, которые очень трудно решить с помощью 2., легко использовать с помощью 3.

2 голосов
/ 17 апреля 2011

Это будет выглядеть как преобразование идентичности :

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

Это одно из самых фундаментальных XSLT-преобразований. Он соответствует любому атрибуту или другому узлу, копирует то, что ему соответствует, а затем применяет себя ко всем атрибутам и дочерним узлам соответствующего узла.

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

0 голосов
/ 17 апреля 2011

Это соответствует каждому элементу или атрибуту и ​​рекурсивно применяет шаблон.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="* | @*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...