Преобразование ODT в один файл XML

Я знаю, что стандарты определяют две версии файла ODT: - одна представляет собой архив разных файлов, т.е. meta.xml, content.xml и т.д., - вторая представляет собой один большой XML-файл со всеми данными. (Я знаю выше из http://en.wikipedia.org/wiki/OpenDocument_technical_specification#Document_Representation)

Последняя версия лучше подходит для обработки, но, к сожалению, не производится OpenOffice.

Вопрос: знаете ли вы какой-нибудь фильтр, конвертер или что-то еще, что помогло бы мне преобразовать файл ODT в архивной версии в один файл XML? Лучше всего будет класс Java.


person WojtusJ    schedule 28.09.2011    source источник


Ответы (2)


И Open Office, и Libre Office могут создавать файлы ODT в формате «один большой XML». Они называются файлами Flat ODT.

Откройте файл ODT и используйте «Сохранить как…». Оттуда вы можете изменить формат файла на «Flat ODT».

person gioele    schedule 28.09.2011
comment
Затем вы можете открыть этот файл в текстовом редакторе или просто использовать cat, и вы увидите отформатированный источник xml. - person Jason S; 10.01.2014
comment
Вы уверены, что есть способ сделать это с помощью LibreOffice? Я нигде не вижу Flat ODT. - person Stéphane Laurent; 17.04.2014
comment
@StéphaneLaurent: да LibreOffice поддерживает файлы Flat ODT. Например, в примечаниях к выпуску для версии 3.4 говорится: «Переписать плоские фильтры импорта и экспорта файлов ODF из Java на C++ дает огромный прирост скорости». - person gioele; 18.04.2014
comment
Спасибо, @gioele, но знаете ли вы, как сохранить файл в этом формате? - person Stéphane Laurent; 18.04.2014
comment
Как и в любом другом формате файла: Сохранить -> выберите OpenDocument Text (Flat XML) (.fodt) в качестве формата в правом нижнем углу. - person gioele; 18.04.2014

Я решил эту проблему, создав таблицу стилей XSLT, которая преобразует исходные файлы ODT в один файл XML, «более или менее» совместимый со стандартом. Ниже приведен код.

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0">

        <xsl:param name="meta.file" select="'meta.xml'" /> 

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

        <xsl:template match="office:document-content">
            <office:document>
                <xsl:copy-of select="@*" />
                <xsl:variable name="meta" select="document($meta.file)/office:document-meta/office:meta" />
                <xsl:copy-of select="$meta" />
                <xsl:apply-templates />
            </office:document>
        </xsl:template>

    </xsl:stylesheet>
person WojtusJ    schedule 13.09.2012