Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / XML, XSL, XPath, XQuery Новый топик    Ответить
 Неполное копирование XML (пропуски в выходном файле)  [new]
Avers
Member

Откуда:
Сообщений: 31
Доброго времени суток. Гугление не помогло, может не по тем ключевым словам ищу гуглю.
В качестве обучающего материала использую книгу "XSLT" Дуг Тидуэлл
Есть входной файл (создается программно):
<root>
    <element1>
        <element2>2</element2>
        <element3>3</element3>
    </element1>
</root>


Есть таблица с двумя шаблонами:
    <xsl:template match="element2" />

    <xsl:template match="*">
        <xsl:copy>
            <xsl:copy-of select="@*" />
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>


На выходе, естественно, получается:
<?xml version="1.0" encoding="UTF-8"?><root>
    <element1>
        
        <element3>3</element3>
    </element1>
</root>


Собственно вопрос: как исключить из файла пустые строки? Т.е. мне нужно получить:
<?xml version="1.0" encoding="UTF-8"?><root>
    <element1>
        <element3>3</element3>
    </element1>
</root>

В вышеупомянутой книге приводится фраза "Если вы захотите удалить эти пропуски, измените таблицу стилей". Но как ее изменить не уточняется.
<xsl:strip-space /> убирает все пропуски и "лепит" весь файл в одну строку.
Пробовал видоизменить шаблоны, тогда строки "лепятся" в одну внутри родительского элемента (element1)
12 авг 17, 13:57    [20718589]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9602
Avers
Собственно вопрос: как исключить из файла пустые строки?
Забейте. На структуру и данные это влияние не оказывает, а смотреть на XML через блокнот - это нонсенс
12 авг 17, 18:38    [20718930]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Фридрих
Member

Откуда:
Сообщений: 60
Avers
<xsl:strip-space /> убирает все пропуски и "лепит" весь файл в одну строку.
Пробовал видоизменить шаблоны, тогда строки "лепятся" в одну внутри родительского элемента (element1)

Ну вроде как и есть решение проблемы
<xsl:output indent="yes"/> - должно всё сделать красиво
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
    <xsl:template match="/">
            <xsl:copy-of select="*" />
    </xsl:template>
</xsl:stylesheet>

должно сработать....
12 авг 17, 21:06    [20719068]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Avers
Member

Откуда:
Сообщений: 31
_Vasilisk_,

Собственно да, на семантическом уровне наличие/отсутствие пустых строк не меняет сути (если они не внутри элементов со смешанным содержимым). Но:
1) когда речь идет о файле размером в десятки тысяч строк и более трети из них пустые - это уже сказывается на размере файла;
2) если есть хотя бы малая вероятность того, что XML придется править в "полевых" условиях, целесообразно задуматься о читаемости/отступах/именовании тегов;
3) да и просто хочется получить файл визуально не хуже исходного :)

Фридрих,

<xsl:output indent="yes"/> без <xsl:strip-space elements="*" /> не оказывает влияния на выходной документ, в сочетании же с <xsl:strip-space elements="*" /> получается что-то вроде:
<?xml version="1.0" encoding="UTF-8"?><root>
<element1>
<element3>3</element3>
</element1>
</root>

тоже не совсем то, что хотелось бы получить. Пустых строк нет, но отступы отсутствуют как таковые, только переносы строк.

Спасибо за ответы.
Похоже, что кротчайший путь к решению моей проблемы - добавить после преобразования XSLT вторую обработку, стороннюю с удалением пустых строк.
14 авг 17, 09:29    [20720860]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Фридрих
Member

Откуда:
Сообщений: 60
Avers,

а ты каким процессором пользуешься? и каким редактором открываешь?
14 авг 17, 10:56    [20721129]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Avers
Member

Откуда:
Сообщений: 31
Фридрих,

Тестовые таблицы XSLT делаю в NetBeans и какой там процессор - понятия не имею (все работает "из коробки"). А файлы открываю либо все тем же NetBeans либо во встроенном в far редакторе.
В NetBeans исключительно пишутся схемы и таблицы, вручную применяются. А продакшн версия встраивается в приложение, написанное на C# (там уже VS2013/VS2017).

пробовал в "xsl:stylesheet" менять свойство version="2.0" между 1.0 и 2.0 - разницы не увидел.
14 авг 17, 11:32    [20721273]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Фридрих
Member

Откуда:
Сообщений: 60
Avers,

пробуй сделать преобразование в другом редакторе....http://xml-copy-editor.sourceforge.net/
а если файл очень большой и процесор будет падать, то надо делать на XQuery http://basex.org/
14 авг 17, 12:24    [20721452]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9602
Avers
1) когда речь идет о файле размером в десятки тысяч строк и более трети из них пустые - это уже сказывается на размере файла;
zip
Avers
2) если есть хотя бы малая вероятность того, что XML придется править в "полевых" условиях, целесообразно задуматься о читаемости/отступах/именовании тегов;
Вы doc файлы тоже в блокноте редактируете?
Avers
3) да и просто хочется получить файл визуально не хуже исходного :)
Опять 25. Данные и отображение данных это принципиально разные понятия
14 авг 17, 19:46    [20723253]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Avers
Member

Откуда:
Сообщений: 31
Фридрих,

Спасибо за ссылки, обязательно попробую.
К сожалению, в моем случае это не решит главной проблемы. Упаковываю все в недра ПО, писанного на C#, даже при <xsl:output indent="yes"/> в сочетании с <xsl:strip-space elements="*" /> дает что-то вроде:
<?xml version="1.0" encoding="UTF-8"?><root><element1><element3>3</element3></element1></root>

Занятно, что даже переносов строк нет. Отличие от предыдущего процессора очевидно, но, увы, не в ту сторону, что нужно. :(
Похоже и правда проще обработать xml как текст (кротчайший путь к цели).

_Vasilisk_,

_Vasilisk_
Avers
1) когда речь идет о файле размером в десятки тысяч строк и более трети из них пустые - это уже сказывается на размере файла;
zip

Вероятно, вы не обратили внимание на мое сообщение ранее. Это преобразование будет находиться внутри ПО, тащить туда zip большого смысла нет. К тому же опыт показывает, что даже сжатие zip не убирает разницу в размерах файлов/архивов. Файл (а также архив с файлом) с пустыми строками (а если быть точным со строками с лишними пробелами и переносом строки) все равно больше, чем аналогичный без лишнего мусора.
_Vasilisk_
Avers
2) если есть хотя бы малая вероятность того, что XML придется править в "полевых" условиях, целесообразно задуматься о читаемости/отступах/именовании тегов;
Вы doc файлы тоже в блокноте редактируете?

Если надо будет, файл редактируется и блокнотом и vi и чем угодно, что есть под рукой. Только doc - староват, хотя бы docx :)
_Vasilisk_
Avers
3) да и просто хочется получить файл визуально не хуже исходного :)
Опять 25. Данные и отображение данных это принципиально разные понятия

Вероятно вы не заметили, в ответе выше я согласился с вами про разницу между отображением и содержанием. А также, прошу обратить внимание, что в посте речь идет именно о наличии мусора (который удобнее и нагляднее продемонстрировать именно на отображении файла), а не о панике в связи с редактированием xml файлов в блокноте (как вы могли подумать).
Как я понимаю, кроме рекомендации "забить" (надо сказать, не худший совет) по существу проблемы добавить вам нечего.
15 авг 17, 18:25    [20726188]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Фридрих
Member

Откуда:
Сообщений: 60
Avers,

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


попробуй полностью прописать выходные данные, может сработает!? Отпишись...
16 авг 17, 03:23    [20726880]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 3236
Avers
Упаковываю все в недра ПО, писанного на C#, даже при <xsl:output indent="yes"/> в сочетании с <xsl:strip-space elements="*" /> дает что-то вроде:
<?xml version="1.0" encoding="UTF-8"?><root><element1><element3>3</element3></element1></root>

Занятно, что даже переносов строк нет.

Потому что в ПО, писанном на C#, xml форматирует XmlWriter, а настройки форматирования задаются посредством XmlWriterSetings. В данном случае в них нужно задать значения свойств Indent = true, IndentChars = "\t" (например).
16 авг 17, 06:23    [20726902]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Avers
Member

Откуда:
Сообщений: 31
Фридрих,

Не помогло в случае ПО, на отдельных процессорах проверю, как будет свободная минутка или след. задача, связанная с XSLT.
Спасибо за помощь! и за ссылки!


Сон Веры Павловны,

Спасибо! Помогло! Именно для ПО писанного на C# оказалось достаточным настроить XmlWriterSettings. Получилась конфетка/персик!


Вывод: гораздо проще проблема решается программно на уровне конкретного используемого языка, библиотек. Управлять форматированием на уровне XSLT оказалось сложнее, чем я мог себе представить.
16 авг 17, 10:57    [20727410]     Ответить | Цитировать Сообщить модератору
 Re: Неполное копирование XML (пропуски в выходном файле)  [new]
Avers
Member

Откуда:
Сообщений: 31
Фридрих,
Сон Веры Павловны,

Следует уточнить. Сработало сочетание:
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />

и параметров XmlWriterSettings
16 авг 17, 11:21    [20727481]     Ответить | Цитировать Сообщить модератору
Все форумы / XML, XSL, XPath, XQuery Ответить