У меня есть 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.
Любая помощь будет оценена!
Майкл, спасибо за ответ. Xslt, предоставленный вами, имеет тот же результат, что и мой первый xslt. Я действительно не хочу иметь «xmlns =» «» на всех под-узлах. Есть ли способ удалить его на под-узлах со вторым xslt? – dellair
@dellair Выход моего XSLT делает ** не ** имеет «xmlns =» «» на всех под-узлах - см .: http://xsltransform.net/pPzifq3 –
Это абсолютно мое плохо. Я только что отредактировал вопрос и скопировал полный xml. Вы можете видеть, что «xmlns =» «" был добавлен в суб-узлы с полным xml. – dellair