xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

При копирование узла добавляется аттрибут xmlns="...&qu


Автор Сообщение
FAV
Гость




[12831] Вт Авг 12, 2008 10:55
При копирование узла добавляется аттрибут xmlns="...&qu
Как при прикопировании узла избежать добавления аттрибута xmlns?
Есть xml-файл:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:mse_invoice_usd_out xmlns:ns1="urn:...">
<RETURN>
<item>
<TYPE>I</TYPE>
<NUMBER>000</NUMBER>
</item>
</RETURN>
</ns1:mse_invoice_usd_out>

Применяю к нему xsl-преобразование: <xsl:template match="item"> <xsl:copy/> </xsl:template>

Получаю:
<item xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" />
Fireball
Наставник

Зарегистрирован: 26.02.2008
Сообщения: 282

[12832] Вт Авг 12, 2008 10:59

http://www.citforum.ru/internet/xslt/xslt07.shtml

Если не ошибаюсь, то должно помочь exclude-result-prefixes .
SuSanin
Аспирант

Зарегистрирован: 26.02.2007
Сообщения: 167
Откуда: Ижевск
[12833] Вт Авг 12, 2008 13:56

при обработки xml( если в нем упоминаются ns) из него все необъявленные в xsl пространства имен (ns = namespace) перекачуют в выходной документ.
Решение - объявить их в xsl. Использовать не обязательно. тогда в выходном файле их не будет.
Что в конкретном примере мы и наблюдаем.
в xml есть строка :

Код:

<ns1:mse_invoice_usd_out xmlns:ns1="urn:...">


а в xsl про xmlns:ns1 нислова. вот и результат.
Гость





[12834] Вт Авг 12, 2008 16:13

Чертовски извиняюсь, подскажите, пожалуйста, как это сделать? Sad
И где? В <xsl:stylesheet>?
Гость





[12835] Вт Авг 12, 2008 16:39

Воспользовался обоими советами и ничего не помогло. Может я, что-то не правильно понял?
Вот окончательный код XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex"
xmlns:xsl="http://.../1999/XSL/Transform"
exclude-result-prefixes="ns1"
version="2.0" >
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no" indent="yes"/>

<xsl:template match="item/*">
<xsl:copy copy-namespaces="no" xsl:exclude-result-prefixes="ns1" />
</xsl:template>

</xsl:stylesheet>
Гость





[12836] Вт Авг 12, 2008 16:43

А в результате имею выходной XML c xmlns!!!Sad

Код:


<?xml version="1.0" encoding="UTF-8"?>
<TYPE xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" />
<ID xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" />
<NUMBER xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" />
<MESSAGE xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" />
<LOG_NO xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" />
<LOG_MSG_NO xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" />

SuSanin
Аспирант

Зарегистрирован: 26.02.2007
Сообщения: 167
Откуда: Ижевск
[12837] Вт Авг 12, 2008 21:38

че то непонятно.
1. давай приведи что есть, как обрабатываешь , что получаешь ,а что хочешь получить
2. ну вот пример:
xml из твоего 1-го примера,
xsl будет выглядеть так:

Код:


<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex">
    <xsl:output method="html" indent="yes"/>

<xsl:template match="item">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>


результат малость конечно не такой как хотелось бы видеть, но все же :

Код:


<item xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex">
   <TYPE>I</TYPE>
   <NUMBER>000</NUMBER>
</item>

Гость





[12840] Ср Авг 13, 2008 07:37

Ну, вот примерно так и хочу видеть выходной XML, только без гадского xmlns
и с использованием <xsl:copy>, т.к. мне нужно еще добавить элементов в узел <item> и переименовать его
в <ИмяМоейТаблицы>
AV
Новичок

Зарегистрирован: 13.08.2008
Сообщения: 3

[12841] Ср Авг 13, 2008 08:17

Еще раз все вместе. Входной xml:

Код:


<?xml version="1.0" encoding="UTF-8"?>
<ns1:mse_invoice_usd_out xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex">
<RETURN>
<item>
   <TYPE>I</TYPE>
   <ID/>
   <NUMBER>000</NUMBER>
   <MESSAGE>aaa</MESSAGE>
</item>
<item>
   <TYPE>W</TYPE>
   <ID/>
   <NUMBER>302</NUMBER>
   <MESSAGE>bbb</MESSAGE>
</item>

</RETURN>
</ns1:mse_invoice_usd_out>



Преобразование XSL:

Код:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            exclude-result-prefixes="ns1"
            version="2.0" >

<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no" indent="yes"/>
<xsl:param name="TABLE_NAME" />
   
   <xsl:template match="item">
      <xsl:element name="{$TABLE_NAME}">
         <xsl:for-each select="./*">
            <xsl:copy-of select="." copy-namespaces="no" xsl:exclude-result-prefixes="ns1"/>
            <!--добавляю нужны мне элементы -->
         </xsl:for-each>
      </xsl:element>
    </xsl:template>
   
</xsl:stylesheet>



В выходные данные лезет пространство имен xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex".
Неужели по-красивому от него никак не избавиться?????!!!!!

Код:


<?xml version="1.0" encoding="UTF-8"?>
<Z_KX_LOG_PUT>
<TYPE xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex">I</TYPE>
<ID xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" />
<NUMBER xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex">000</NUMBER>
<MESSAGE xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex">aaa</MESSAGE>
</Z_KX_LOG_PUT>
<Z_KX_LOG_PUT>
<TYPE xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex">W</TYPE>
<ID xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" />
<NUMBER xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex">302</NUMBER>
<MESSAGE xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex">bbb</MESSAGE>
</Z_KX_LOG_PUT>

Fireball
Наставник

Зарегистрирован: 26.02.2008
Сообщения: 282

[12845] Ср Авг 13, 2008 13:32

Код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet   xmlns:ns1="urn:sng.uit.obr.sd.exchange.sex" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no" indent="yes"/>

<xsl:template match="item">
   <table>
      <xsl:apply-templates select="@* | node()"/>
   </table>
</xsl:template>

<xsl:template match="@* | node()">
   <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
   </xsl:copy>
</xsl:template>
   
</xsl:stylesheet>



Префиксы остаются только на корневой ноде.
Второй шаблон копирует все ноды по дефолту.
<table> заменить на свой <xsl:element>. Лень просто было с передачей параметров париться внутрь XSL.

Если надо и на корневой убрать, то будем думать дальше Smile

PS. И не пользуйтесь copy-of. Его прекрасно и более функционально заменяет apply-templates. Хотя везде есть исключения.
Гость





[12847] Ср Авг 13, 2008 14:58

КРУТО!!! Спасибо огромное!!! Префикс на корневом я переживу... Smile

P.S
Только я не понимаю в чем разница?
Почему в одном случае добавляет в др. - нет?
Или код, который я написал - не корректный, так никто не пишет?(2-й день как xsl пользую)
Fireball
Наставник

Зарегистрирован: 26.02.2008
Сообщения: 282

[12848] Ср Авг 13, 2008 15:08

Мне почему-то кажется, что разница в copy-of. Надо поэксперементировать.
А вообще, код не очень изначально был написан, поэтому я написал по своему и как мне лучше показалось.