Как избежать попадания пространства имен в выходной XML в XSLT

Я работаю над преобразованиями XML в XML через XSLT. Я хочу удалить пространства имен в выходном xml. Для этого я использовал параметр «Исключить префикс результата», но в выводе я все еще вижу пространства имен.

Исходный XML:

 <?xml version="1.0" encoding="ISO-8859-1"?>
 <aaa>
 hello
 </aaa>

XSLT написано:

 <?xml version="1.0" encoding="utf-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"      xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:simple="aaaa" xmlns:xlink="http://www.w3.org/1999/xlink"      xmlns:tcm="http://www.tridion.com/ContentManager/5.0" exclude-result-prefixes="msxsl simple wireframe widget tcdl tcm xlink"      xmlns:wireframe="bbb" xmlns:widget="ccc" xmlns:tcdl="tcdl">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
 <xsl:template match="/">
  <wireframe:wireframe>
       <wireframe:si>
         <widget:ah>
         <xsl:value-of select="aaa" />
               </widget:ah> 
         </wireframe:si>
 </wireframe:wireframe>
 </xsl:template>
   </xsl:stylesheet>

ВЫХОД:

 <?xml version="1.0" encoding="utf-8"?>
 <wireframe:wireframe xmlns:wireframe="aaaa">
   <wireframe:si>
     <widget:ah xmlns:widget="bbb">
 hello
 </widget:ah>
   </wireframe:si>
 </wireframe:wireframe>

Ожидаемый результат:

 <?xml version="1.0" encoding="utf-8"?>
 <wireframe:wireframe>
   <wireframe:si>
     <widget:ah>
 hello
 </widget:ah>
   </wireframe:si>
 </wireframe:wireframe>

Подскажите, пожалуйста, как избежать появления пространства имен в выходном XML.

Заранее спасибо.


person Patan    schedule 13.03.2012    source источник
comment
Можете ли вы предоставить фрагмент оскорбительных файлов XML и XSLT.   -  person Ali Khalid    schedule 13.03.2012
comment
Предоставленный вами ожидаемый результат не является допустимым XML, поскольку в нем отсутствуют определения пространств имен. Зачем тебе это вообще нужно?   -  person newtover    schedule 13.03.2012
comment
Просто для уточнения, вы пытаетесь создать ссылки на пользовательские элементы управления, taglibs или что-то подобное? Как спрашивает newtover, непонятно, зачем нужны префиксы.   -  person Chris Summers    schedule 13.03.2012


Ответы (3)


Вы можете исключить два используемых пространства имен в атрибуте exclude следующим образом:

exclude-result-prefixes="msxsl simple xlink tcm tcdl"

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

<?xml version="1.0" encoding="UTF-8"?>
<wireframe:wireframe xmlns:widget="ccc" xmlns:wireframe="bbb">
    <wireframe:si>
        <widget:ah>
 hello
 </widget:ah>
    </wireframe:si>
</wireframe:wireframe>
person Maestro13    schedule 13.03.2012

Вы просите о том, что невозможно! Пространство имен XML является частью языка XML, это все равно, что просить удалить все пакеты в Java или пространства имен в C#!

Короче говоря, вы ожидали, что вывод XML будет недопустимым XML-документом, и, следовательно, вы не можете создать его из XSLT, который предназначен для создания допустимого XML.

Вы можете полностью удалить префиксы пространств имен, удалив их из XSLT:

<?xml version="1.0" encoding="utf-8"?>
<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:template match="/">
        <wireframe>
            <secureInbox>
                <alertHeader>
                    <xsl:value-of select="aaa" />
                </alertHeader>
            </secureInbox>
        </wireframe>
    </xsl:template>
</xsl:stylesheet>

Что дает следующий результат:

<wireframe>
    <secureInbox>
        <alertHeader>
            hello
        </alertHeader>
    </secureInbox>
</wireframe>
person ColinE    schedule 13.03.2012

Хотя это ужасно плохая практика, на самом деле можно сгенерировать этот неправильный XML. Вы можете установить тип вывода XSLT как текст, а затем сгенерировать теги без пространства имен следующим образом:

<xsl:text disable-output-escaping="yes">&amp;lt;wireframe:wireframe&amp;gt;</xsl:text>

и так далее..

Лично я отношу это к категории «не пытайтесь повторить это дома», но если вы не платите ни копейки за правильный стиль xslt, вперед!

person Quirijn    schedule 13.03.2012
comment
Я бы не был таким пуристом. Часто есть веские причины сделать что-то подобное. Скажем, например, вы хотите сгенерировать фрагмент сериализованного XML для встраивания в более крупный документ. Как только вы укажете тип вывода как текст, это уже не XML! В любом случае, +1 за фактический ответ на вопрос. - person Dominic Cronin; 13.03.2012
comment
Я не могу дать вам +1, как и Доминик, я утверждаю, что это не выводит действительный XML, поэтому на самом деле не отвечаю на вопрос. Если бы вопрос заключался в том, что я работаю над преобразованием XML в текст с помощью XSLT... вы бы получили мой голос. - person Chris Summers; 14.03.2012