Скопируйте исходный XML и другие детали - PullRequest
0 голосов
/ 28 ноября 2011

Исходный файл

<?xml version="1.0" encoding="UTF-8"?>
<!--It will contain more data, just given few here-->
<Food>
<Menu>Item1</Menu>
</Food>

Требуется вывод:

<?xml version="1.0" encoding="UTF-8"?>
<Detail>
<SubDetail>
<Food>
<Menu>Item1</Menu>
</Food>
</SubDetail>
</Detail>

Я хотел бы добавить исходный xml (содержит более 200 строк) между Detail и SubDetails. Не могли бы вы сказать мне, как написать xslt.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2011

Просто констатирую очевидное: вместо явного рекурсивного копирования вы также можете использовать команду <xsl:copy-of>, если хотите скопировать выбранный узел и все его содержимое.Копирование всего входного документа внутри элемента оболочки <Detail> и <SubDetail> может быть выполнено с помощью одной команды xsl в одном шаблоне.Ваш окончательный вариант использования, вероятно, более сложный, но логика та же.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>

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

</xsl:stylesheet>
0 голосов
/ 28 ноября 2011

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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>

  <xsl:template match="/">
    <Detail>
      <SubDetail>
        <xsl:apply-templates/>
      </SubDetail>
    </Detail>
  </xsl:template>

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

</xsl:stylesheet>
...