Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как добавить XML namespace при XSLTransform


Автор: Mr_Smith 3.8.2007, 13:28
Здравствуйте.  Скажите, как проставить в тегах элементов выходного файла префиксы. не вручную же их в шаблоне прописывать, потому как большей частью мне нужны элементы из исходного файла и затевать ручное переписывание всех исходных тагов с шаблоне на такие же только с префиксом желания нету. Я не думаю что во втором фреймворке нет механизма по автоматизации такого дела.

Наглядный пример:
Исходник:
Код

<?xml version="1.0"?>
<root>
<data>
 <pole>8778</pole>
 <pole>89789</pole>
</data>
<data>
 <pole>8998</pole>
 <pole>89799</pole>
</data>
</root>



Должно получиться:
Код

<?xml version="1.0" encoding="UTF-8"?>
<V8Exch:_1CV8DtUD xmlns:V8Exch="http://www.1c.ru/V8/1CV8DtUD/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:v8="http://v8.1c.ru/data">
<V8Exch:root>
<V8Exch:data>
 <V8Exch:pole>8778</V8Exch:pole>
 <V8Exch:pole>89789</V8Exch:pole>
</V8Exch:data>
<V8Exch:data>
 <V8Exch:pole>8998</V8Exch:pole>
 <V8Exch:pole>89799</V8Exch:pole>
</V8Exch:data>
</V8Exch:root>
</V8Exch:_1CV8DtUD>

Автор: -ser- 4.8.2007, 14:17
Цитата

Я не думаю что во втором фреймворке нет механизма по автоматизации такого дела.

Я не думаю что фреймворк вообще должен иметь какое-то отношение к такому делу. Это задача xslt, а ее просто надо правильно написать, а если не знаешь как правильно, то напиши как умеешь.
Хоть желания у меня тоже небыло никакого, но вот что-то накарябал с ручным переписыванием. Можно написать изящнее xslt, а на результате поработать regex'ом или простыми манипуляциями со строками, это если исходный файл имеет множество разных нодов.

Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:V8Exch="http://www.1c.ru/V8/1CV8DtUD/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:v8="http://v8.1c.ru/data">
    <xsl:output method="xml"/> 
    <xsl:strip-space elements="*"/>  
    <xsl:variable name="data" select="/root/data"/>
    <xsl:variable name="pole" select="/root/data/pole"/>
    <xsl:template match="/">
        <V8Exch:_1CV8DtUD>
            <V8Exch:root>
                 <xsl:apply-templates select="/root"/>
            </V8Exch:root>
        </V8Exch:_1CV8DtUD>        
    </xsl:template>    
    <xsl:template match="data">                
        <V8Exch:data>                
             <xsl:for-each select="pole">                
                 <V8Exch:pole>
                     <xsl:value-of select="."/> 
                 </V8Exch:pole>                
             </xsl:for-each>                    
        </V8Exch:data>
    </xsl:template>
</xsl:stylesheet>

Автор: -ser- 7.8.2007, 08:48
это немного получше

Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:V8Exch="http://www.1c.ru/V8/1CV8DtUD/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:v8="http://v8.1c.ru/data">
    <xsl:output method="xml"/> 
    <xsl:strip-space elements="*"/>  
    <xsl:variable name="data" select="/root/data"/>
    <xsl:variable name="pole" select="concat($data,'/pole')"/>
    <xsl:variable name="V8Exch" select="'V8Exch:'"/>
    <xsl:template match="data">
        <xsl:element name="{concat($V8Exch,local-name())}">            
             <xsl:for-each select="pole">
                 <xsl:element name="{concat($V8Exch,local-name())}">            
                     <xsl:value-of select="."/> 
                 </xsl:element>
             </xsl:for-each>                    
        </xsl:element>        
    </xsl:template>
    <xsl:template match="/">
        <xsl:element name="{concat($V8Exch,'_1CV8DtUD')}">
            <xsl:element name="{concat($V8Exch,'root')}">
                <xsl:apply-templates/>
            </xsl:element>
        </xsl:element>
    </xsl:template>  
</xsl:stylesheet>

Автор: Mr_Smith 7.8.2007, 09:00
Спасибо -ser-  

я думал что раз есть XMLNamespaceManager, то есть и способы цепляния префиксов при копировании в выходной поток. Буду делать через шаблон.

Автор: -ser- 7.8.2007, 09:33
вот еще небольшая модификация. здесь избавились от ручного написания 'root'
вместо 
Код

<xsl:element name="{concat($V8Exch,'root')}">


можно написать
Код

<xsl:element name="{concat($V8Exch,local-name(/node()))}">

можно совершенствовать бесконечно.

Цитата

я думал что раз есть XMLNamespaceManager...

в принципе, ты структуру документа почти не меняешь, можно вообще средствами .нета все сделать. 
я просто сам с xsl ковырялся, так по горячему решил и здесь написать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)