Как избежать появления пространства имен в выходном XML в XSLT - PullRequest
1 голос
/ 13 марта 2012

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

Sorce 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>

Произведено OUTPUT:

 <?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.

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

Ответы [ 3 ]

4 голосов
/ 13 марта 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>
3 голосов
/ 13 марта 2012

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

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

и т. Д.

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

2 голосов
/ 13 марта 2012

Вы можете опустить два используемых пространства имен в атрибуте 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>
...