2013-10-28 4 views
0

Хотите добавить объявление Xmlns только корень, и я использую этот XML:XSLT XMLNS на корню только

<Message> 
</Message> 

и XSLT:

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

<xsl:element name="Element1" namespace="http://www.blablabla.com"> 
<xsl:element name="Element2"> 
<xsl:element name="Element3">Hmm</xsl:element> 
</xsl:element> 
<xsl:element name="Element4"> 
</xsl:element> 
</xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

Результат является:

<Element1 xmlns="http://www.blablabla.com"> 
<Element2 xmlns=""> 
<Element3>Hmm</Element3> 
</Element2> 
<Element4 xmlns=""/> 
</Element1> 

Я хочу только Element1 иметь xmlns не Element2, 4 или другие.

Я могу сделать так, но это означает, что писать для каждого элемента имя переменной:

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

<xsl:variable name="vNS" 
    select="'http://www.blablabla'"/> 


<xsl:template match="/"> 

<xsl:element name="Element1" namespace="{$vNS}"> 
<xsl:element name="Element2" namespace="{$vNS}"> 
<xsl:element name="Element3" namespace="{$vNS}">Hmm</xsl:element> 
</xsl:element> 
<xsl:element name="Element4" namespace="{$vNS}"> 
</xsl:element> 
</xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

Как это сделать? Спасибо.

ответ

0

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

Например:

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

    <xsl:template match="/"> 
     <bla:Element1> 
      <Element2> 
       <Element3>Hmm</Element3> 
      </Element2> 
      <Element4 /> 
     </bla:Element1> 
    </xsl:template> 
</xsl:stylesheet> 

Это создаст необходимое пространство имен только на первый элемент. Вам просто нужно объявить пространство имен в объявлении stylesheet, а затем вы можете использовать это пространство имен непосредственно в элементах. Также ваш XSLT более читабельен, если вы избегаете xsl:element.

+0

Спасибо за ответ. Я немного изменил свой код. ' Хмм ' –

+0

Вы изменили объявление пространства имен в таблице стилей на пространство имен по умолчанию 'xmlns =" ​​http://www.blablabla.com "'. Это означает, что все элементы без префикса пространства имен будут частью этого пространства имен по умолчанию. Это совсем не так, как ваш вопрос о том, как задать только пространство имен для первого элемента. Просто отметить ... –

+0

Еще только первый элемент имеет xmlns. Если я запускаю мой код это то, что я получаю: ' Хм ' –

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