У меня есть несколько XML-файлов, которые могут быть входными для XSLT. В этих нескольких входных XML-файлах я не знаю всех пространств имен, которые могут быть использованы, и я не знаю всех корневых узлов, которые могут быть использованы, все, что я знаю, состоит в том, что все элементы находятся в одном пространстве имен.Скопировать все, добавить элементы в другое пространство имен, объявить пространство имен в корневом узле
Так что мой вход XML может быть:
<?xml version="1.0" encoding="UTF-8"?>
<foo:someUnknownRoot xmlns:foo="http://anUnknownNamespace/foo">
<foo:element>value</foo:element>
</foo:someUnknownRoot>
ли другой может быть:
<?xml version="1.0" encoding="UTF-8"?>
<bar:anotherUnknownRoot xmlns:bar="http://anUnknownNamespace/bar">
<bar:element>value</bar:element>
</bar:anotherUnknownRoot>
Я хочу создать XSLT, что просто копирует полный входной и добавляет элементы в собственной определенной приставкой , Пространство имен, которое мне нравится объявлять в корневом узле.
Так что я бы ожидать выход, как это (один пример):
<?xml version="1.0" encoding="UTF-8"?>
<bar:anotherUnknownRoot xmlns:bar="http://anUnknownNamespace/bar" xmlns:added="http://myAddedNamespace/added">
<added:element>value</added:element>
<bar:element>value</bar:element>
</bar:anotherUnknownRoot>
Я попытался с помощью следующей XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:added="http://myAddedNamespace/added">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<added:element>value</added:element>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Но это выведет:
<?xml version="1.0" encoding="UTF-8"?>
<bar:anotherUnknownRoot xmlns:bar="http://anUnknownNamespace/bar">
<added:element xmlns:added="http://myAddedNamespace/added">value</added:element>
<bar:element>value</bar:element>
</bar:anotherUnknownRoot>
Конечно, это правильный XML, но для удобочитаемости я хотел бы добавить «добавленное» пространство имен в корневой узел.