2012-05-22 2 views
1

Как добавить пространство имен в корневой элемент?Добавление пространства имен только к одному элементу

Мой XML:

<Envelope> 
    <from> 
     <contents /> 
    </from> 
</Envelope> 

Мой желаемый результат:

<Envelope xmlns:tns="Foo"> 
    <from> 
     <contents /> 
    </from> 
</Envelope> 

я могу получить только "Xmlns = 'Foo'", используя это, а не "Xmlns: ТНС = ..":

<xsl:element name="{local-name()}" namespace="Foo" > 
     <xsl:copy-of select="attribute::*"/> 
     <xsl:apply-templates /> 
</xsl:element> 
+0

Буффало: я сначала не понял вопрос - и был предупрежден Шон Б.Дуркин. С тех пор я исправил ответ - пожалуйста, используйте обновленный ответ. –

ответ

2

Вот полное преобразование:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:tns="Foo"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="/*"> 
     <xsl:element name="{name()}"> 
     <xsl:copy-of select= 
     "document('')/*/namespace::*[name()='tns']"/> 
     <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется на поставленном XML документа:

<Envelope> 
    <from> 
     <contents /> 
    </from> 
</Envelope> 

разыскиваемый, правильный результат получается:

<Envelope xmlns:tns="Foo"> 
    <from> 
     <contents/> 
    </from> 
</tns:Envelope> 
+0

Мое чтение вопроса состояло в том, что элемент Envelope не должен был быть частью пространства имен Foo. Здесь что-то кажется неловким. Сравните фрагмент «Мой желаемый результат» Buffalo с фрагментом «Требуемый, правильный результат». –

+0

@ SeanB.Durkin: Теперь, когда я смотрю на это, вы правы! Я исправлю ответ в ближайшее время. –

+0

@ SeanB.Durkin: Готово. –

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