Скопируйте содержимое 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>