XSL для копирования корневого узла в + добавить атрибуты - PullRequest
5 голосов
/ 01 июля 2011

Я новый пользователь XSLT и борюсь с этой проблемой.

Исходный XML:

<ABC X="" Y="" Z=""/>

Результат XML:

<CDE F="">
<ABC X="" Y="" Z"" G=""/>
</CDE>

Таким образом, мне нужнона

  • Создание корневого узла с атрибутом со значением по умолчанию в результате xml.
  • Копирование узла (источник имеет только один узел) из источника в результат xml.
  • Добавление дополнительных атрибутов к узлу, скопированному из исходного XML.

Я могу сделать это отдельно, но я не могу сделать все это в одном XSLT.

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Учитывая ваши предположения, кажется, вам нужен один минимальный шаблон:

<xsl:template match="ABC">
 <CDE F="">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:attribute name="G">hello</xsl:attribute>
   </xsl:copy>
 </CDE>
</xsltemplate>

или, если вы предпочитаете:

<xsl:template match="/">
 <CDE F="">
  <xsl:apply-templates select="ABC"/>
 </CDE>
</xsl:template>

<xsl:template match="ABC">
   <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:attribute name="G">hello</xsl:attribute>
   </xsl:copy>
</xsl:template>
0 голосов
/ 01 июля 2011

В вашем примере XML он не нужен (см. Ответ @ empo), но когда вы начинаете, самая важная вещь для изучения - это шаблон «преобразования личности». Он в основном копирует все ваши входные данные XML как есть и без изменений. Любые изменения, которые вам нужно внести, обычно могут быть сделаны путем переопределения преобразования идентификаторов другими шаблонами.

Вот пример таблицы стилей, которая дает вам вывод, который вы ищете:

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

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

  <xsl:template match="/ABC">
    <CDE F="">
      <ABC G="">
        <xsl:copy-of select="@*"/>
      </ABC>
    </CDE>
  </xsl:template>

</xsl:stylesheet>

ПРИМЕЧАНИЕ. «Идентификационное преобразование» не используется при обработке вашего входного XML, поскольку шаблон match="/ABC" обрабатывает один элемент, который у вас есть. Однако, если вы добавите что-то в ваш XML-файл, он будет включен в вывод без изменений.

Например, это модифицированный ввод XML:

<ABC X="" Y="" Z="">
  <FOO BAR=""/>
</ABC>

преобразован со следующей таблицей стилей (как и выше, только я добавил <xsl:apply-templates/> в шаблон /ABC):

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

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

  <xsl:template match="/ABC">
    <CDE F="">
      <ABC G="">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
      </ABC>
    </CDE>
  </xsl:template>

</xsl:stylesheet>

производит следующий вывод:

<CDE F="">
   <ABC G="" X="" Y="" Z="">
      <FOO BAR=""/>
   </ABC>
</CDE>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...