2016-02-26 7 views
2

У меня есть XML:XSLT Добавление атрибута XML корневого узла

<doc> 
    <tag1> 
     <tag11>1</tag11> 
     <tag12>abc</tag12> 
     <tag13>test</tag13> 
     <tag14>content</tag14> 
     <tag15>2-</tag15> 
     <tag16>content</tag16> 
     <tag17> 
     <tag171>TITLE</tag171> 
     <tag172>T3</tag172> 
     <tag173>No</tag173> 
     <tag17> 
     <tag18 id="t/9905">aaa</tag18> 
     <tag18 id="t/9905">bbb</tag18> 
    </tag1> 
    <tag2> 
     <tag21>2016</tag21> 
     <tag22> 
     <tag221>1</tag221> 
     <tag222>OMG</tag222> 
     </tag22> 
     <tag23> 
     <tag231>Test</tag231> 
     <tag232>2016-01-18T00:00:00</tag232> 
     <tag233>This is a test</tag233> 
     </tag23> 
    </tag2> 
</doc> 

Я хочу, чтобы добавить атрибут (пространства имен) для корневого элемента:/документ таким образом, что выход будет выглядеть так:

<doc xmlns="urn:test"> 
    <tag1> 
     <tag11> 
     <othertags /> 
     </tag11> 
    </tag1> 
    <tag2> 
     <tag21> 
     <othertags2 /> 
     </tag21> 
    </tag2> 
</doc> 

Я пробовал три xslt (пропустил копию по умолчанию, чтобы уменьшить длину вопроса).

xslt1: смотри ниже, проблема состоит в том, что пустое пространство имен Xmlns = "" добавляется ко всем суб-узел/DOC (то есть:/DOC/tag1 и/DOC/tag2)

<xsl:template match="/doc"> 
    <xsl:element name="{local-name()}" namespace="urn:test" > 
     <xsl:copy-of select="attribute::*"/> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:element> 
</xsl:template> 

Xslt2 см ниже, проблема заключается в том, что «н.з.» добавляется к корневому узлу: и

<xsl:template match="/*"> 
    <xsl:element name="ns:{local-name()}" namespace="urn:test"> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:element> 
</xsl:template> 

xslt3 см ниже, проблема сообщается, что ошибка: Undefined префикса пространства имен «урна». XPST0081: Префикс пространства имен, используемый в выражении, должен расширяться в URI пространства имен, используя статически известные пространства имен.

<xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:attribute name="xmlns"> 
     <xsl:value-of select="urn:test" /> 
     </xsl:attribute> 
    <xsl:copy-of select="@*" /> 
    <xsl:apply-templates /> 
    </xsl:copy> 
</xsl:template> 

Я просто хочу простой выход с xmlns = "urn: test" с корневым узлом/doc.

Любая помощь будет оценена!

ответ

2

Я хочу добавить атрибут (пространство имен) для корневого элемента

Объявление пространства имен не атрибута. И требуемое изменение требуется не только одному корневому элементу: пространство имен, объявленное в корне, наследуется всеми его потомками. Это означает, что вам нужно переместить всех элементов в новое пространство имен:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*"> 
    <xsl:element name="{local-name()}" namespace="urn:test"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

Майкл, спасибо за ответ. Xslt, предоставленный вами, имеет тот же результат, что и мой первый xslt. Я действительно не хочу иметь «xmlns =» «» на всех под-узлах. Есть ли способ удалить его на под-узлах со вторым xslt? – dellair

+0

@dellair Выход моего XSLT делает ** не ** имеет «xmlns =» «» на всех под-узлах - см .: http://xsltransform.net/pPzifq3 –

+0

Это абсолютно мое плохо. Я только что отредактировал вопрос и скопировал полный xml. Вы можете видеть, что «xmlns =» «" был добавлен в суб-узлы с полным xml. – dellair

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