Скопируйте содержимое XML-файла, за исключением корневого узла и атрибута XSLT

Я работаю над небольшим XSLT-файлом, чтобы скопировать содержимое XML-файла и убрать объявление и корневой узел. Корневой узел имеет атрибут пространства имен.

В настоящее время он работает, за исключением того, что теперь атрибут namespace копируется в прямые дочерние узлы.

Вот мой xslt-файл, ничего большого или сложного:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

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

Мой входной файл выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<Report_Data xmlns="examplenamespace">
    <Report_Entry>
        <Report_Date>
        </Report_Date>
    </Report_Entry>
    <Report_Entry>
        <Report_Date>
        </Report_Date>
    </Report_Entry>
    <Report_Entry>
        <Report_Date>
        </Report_Date>
    </Report_Entry>
</Report_Data>

Вывод после XSLT выглядит следующим образом:

<Report_Entry xmlns="examplenamespace">
    <Report_Date>
    </Report_Date>
</Report_Entry>
<Report_Entry xmlns="examplenamespace">
    <Report_Date>
    </Report_Date>
</Report_Entry>
<Report_Entry xmlns="examplenamespace">
    <Report_Date>
    </Report_Date>
</Report_Entry>

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

Если вам интересно, я знаю, что вывод XSLT сформирован неправильно. Я добавляю декларацию XML и другое имя корневого узла позже после трансформации XSLT.

1 ответ

Решение

Следующее производит вывод, который вы хотите:

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

  <xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8"/>

  <!-- For each element, create a new element with the same local-name (no namespace) -->
  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

  <!-- Skip the root element, just process its children. -->
  <xsl:template match="/*">
    <xsl:apply-templates/>
  </xsl:template>

</xsl:stylesheet>
Другие вопросы по тегам