2014-02-06 3 views
1

У меня есть несколько 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, но для удобочитаемости я хотел бы добавить «добавленное» пространство имен в корневой узел.

ответ

0

просто добавить

<xsl:namespace name="added">http://myAddedNamespace/added</xsl:namespace> 

после <xsl:copy>

Смежные вопросы