Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Создание отступов в XML посредством XSLT / 10 сообщений из 10, страница 1 из 1
09.02.2009, 10:39
    #35805086
Comanche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
Всем привет,

чтобы сделать сабж, я использую следующий XSLT:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<?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='true'/>
     <xsl:template match='@* | node()'>
          <xsl:copy>
               <xsl:apply-templates select='@* | node()' />
          </xsl:copy>
     </xsl:template>
</xsl:stylesheet>

Он работает, только вот пустые узлы, записанные как
Код: plaintext
<Client name='John' />
преобразует в
Код: plaintext
1.
<Client name='John'>
</Client>
Т.е. он не просто переводит такой узел в "полный" формат записи, но и разносит при этом его на две строки - а это уже не пустой тэг, и потому это противоречит моей XSD-схеме, согласно которой узел "Client" обязан быть пустым. Короче говоря, после прогона вышеозначенного XSLT я получаю invalid XML.

Я попробовал другое преобразование:

Код: plaintext
1.
2.
3.
4.
5.
6.
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:x='#MyNamespace'>
     <xsl:output method='xml' version='1.0' encoding='UTF-8' indent='true'/>
     <xsl:template match='/'>
          <xsl:copy-of select='x:MyRootElement' />
     </xsl:template>
</xsl:stylesheet>

- оно не коверкает пустые узлы, но вот создаёт отступы в XML'е только если этот XML уже разнесён на строки. Т.е. оно создаст отступы в

Код: plaintext
1.
2.
3.
4.
5.
6.
<?xml version="1.0" encoding="UTF-16"?>
<x:MyRootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="#MyNamespace'">
<x:ChileNode1 name="Child one">
<x:ChileNode2 name="Grandchild one">
</x:ChileNode2>
</x:ChileNode1>
</x:MyRootElement>

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

<?xml version="1.0" encoding="UTF-16"?><x:MyRootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="#MyNamespace'"><x:ChileNode1 name="bla-bla-bla"><x:ChileNode2 name="bla-bla-bla"></x:ChileNode2></x:ChileNode1></x:MyRootElement>

Т.е. тоже не вариант.

Может ли кто посоветовать "золотую середину", которая и пустые узлы не трогает (не разбивает их на открывающий/закрывающий тэги, сидящие в разных строках), и одинаково хорошо разносит как single-line, так и multi-line XML?
...
Рейтинг: 0 / 0
09.02.2009, 11:45
    #35805280
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
Gecko так не делает. Чем трансформишь?
...
Рейтинг: 0 / 0
09.02.2009, 11:47
    #35805292
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
кстати, indent='true' – неправильно, надо indent='yes'. Тупые америкосы, однако.
...
Рейтинг: 0 / 0
09.02.2009, 15:05
    #35805903
Comanche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
maXmoGecko так не делает. Чем трансформишь?Использую библиотеку MS XML v.6.0 (msxml6.dll), метод transformNode объекта DOMDocument.
...
Рейтинг: 0 / 0
09.02.2009, 15:54
    #35806074
Comanche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
В принципе, я могу использовать второй вариант преобразования, предварительно разбив весь XML на отдельные строки по открывающей угловой скобке. Но это уж на самый крайний случай.
...
Рейтинг: 0 / 0
09.02.2009, 23:40
    #35807017
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
MSXML ложит на indent

Почитайте это

С уважением, Vasilisk
...
Рейтинг: 0 / 0
12.02.2009, 11:21
    #35812896
Comanche
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
MSXML ни на что не ложит, почитайте это :)

А если серьёзно - то в форумах Microsoft подсказали ответ. В коде VB6 нужно использовать (при объявлениях и инстанциациях) тип DOMDocument60, а не DOMDocument - даже при условии, что к VB6-проекту явно подключена 6-я версия библиотеки MSXML! И ведь, блин, знал когда-то эту "фичу", да забыл. Эта библиотека, при переходе от младшей своей версии к старшей, сохраняет совместимость "экстенсивным" образом - т.е. не только блюдёт binary compatibility существующих элементов, но ещё и расширяет свою объектную модель , включая в неё элементы предыдущей (младшей) версии, помеченные постфиксом с номером версии.

Иными словами, XSLT-преобразование первого типа (см. мой первый пост) обращается с пустыми узлами в зависимости от версии библиотеки MSXML следующим образом:

Код: plaintext
1.
2.
 v.3.0:  <Client name='John'/> ---> <Client name='John'> CRLF </Client>
 v.6.0:  <Client name='John'/> ---> <Client name='John'></Client>
(где "CRLF" обозначает перевод строки, являющийся источником проблемы)

Поэтому явное использование версии 6.0 решает мою проблему!
...
Рейтинг: 0 / 0
21.02.2009, 13:35
    #35830950
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
ну если не ident, то только или  
...
Рейтинг: 0 / 0
21.02.2009, 13:37
    #35830951
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
Код: plaintext
	 или  
...
Рейтинг: 0 / 0
21.02.2009, 13:38
    #35830955
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание отступов в XML посредством XSLT
да чтож такое...
ну если не ident, то только
Код: plaintext
амперсанд# 9 ; или амперсанд# 160 ;
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Создание отступов в XML посредством XSLT / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]