XSL, который возвращает XML без изменений - PullRequest
24 голосов
/ 28 декабря 2008

Я ищу фрагмент XSL, который просто возвращает XML без изменений. Это звучит тривиально, но я не могу найти пример где-либо в Интернете. Любая помощь там?

Ответы [ 3 ]

32 голосов
/ 29 декабря 2008

Чтобы скопировать полный XML-документ, необходимо иметь шаблон, соответствующий корню. Это может быть:

<xsl:template match="/">

или

<xsl:template match="node()">

Тогда достаточно одного копирования текущего узла (корневого узла):

<xsl:copy-of select = "." />

Итак, одно из таких полных преобразований:

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

Хотя это, вероятно, самое простое подобное преобразование, XSLT-программисты используют другое, широко известное как identity transformation или identity rule:

<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 и настолько широко используется, заключается в том, что, переопределяя это правило шаблона с другими, более конкретными шаблонами, можно очень легко выполнять различные операции, которые иначе будет сложно. Примерами являются удаление определенного (набора) элемента (ов), которые имеют определенное имя или удовлетворяют некоторым другим условиям, переименование определенных элементов, изменение пространства имен конкретных элементов, создание новых дочерних или родственных элементов определенных элементов, ... и т. Д.

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

10 голосов
/ 29 декабря 2008

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

<xsl:template match="@*|node()">
   <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>
0 голосов
/ 28 декабря 2008

Как насчет:

<xsl:template match ="/">
  <xsl:copy-of select="."/>
</xsl:template>

Может быть, есть еще более простой способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...