Расширение возможностей редактирования документов в OpenOffice при помощи XSLT

Создани фильтров импорта и экспорта, позволяющих работать с XML как с обычными документами

Возможно, вы знаете, что данные в формате XML можно загружать в Calc (приложение OpenOffice для работы с таблицами), но знаете ли вы о возможности создания фильтров для редактирования документов XML в текстовом процессоре OpenOffice? В данном руководстве мы расскажем об использовании фильтров импорта/экспорта, которые позволяют работать с XML точно так же, как с обычными текстовыми документами. Это значительно облегчает задачу редактирования данных XML, которые затем можно сохранить в исходном формате. Кроме того, фильтры также позволяют легко преобразовывать ваши документы в формат XML.

Джонатан Левин, независимый инструктор и консультант, внештатный писатель

Джонатан Левин (Jonathan Levin) является независимым инструктором и консультантом по бесчисленному множеству вопросов, начиная от XML/XSLT и Ajax и заканчивая низкоуровневыми протоколами и драйверами для Linux и Windows. Он спроектировал и разработал легковесную Web-ориентированную среду под названием JADE (http://jade.hisown.com), обладающую функциями корпоративной почты, календаря, RSS и удаленной файловой системы. В JADE широко используются возможности XML и XSLT, а также PHP и JavaScript для серверной и клиентской обработки соответственно.



05.03.2010

Перед началом работы

Данное руководство рассчитано на пользователей OpenOffice, интересующихся работой с документами XML. Если вы знакомы со строгим синтаксисом XML и имеете опыт работы с языком стилевых преобразований XML (XML Style Language Transformations – XSLT), то перед вами открывается широкий круг возможностей использования OpenOffice в качестве средства для редактирования любых документов XML. В частности, мы продемонстрируем мощь использования XSLT для автоматического манипулирования и выполнения преобразований документов из формата XML в формат OpenOffice и обратно. Это помогает решать проблемы, связанные с различиями между форматом XML, ориентированным на автоматическую обработку, и гипертекстом, обеспечивающим удобство для человеческого восприятия.

Изменение от 11 января 2008 г.: Строки 2 и 4 в листинге 10 откорректированы следующим образом:

...
 <xsl:template match="/">
    <!-- Скопируйте сюда фрагмент OpenDocument из файла context.xml-->
</xsl:template>
...

Об этом руководстве

Сразу после своего создания OpenOffice рассматривался в качестве эдакого "бунтовщика не без причины" относительно популярного пакета Microsoft Office. Однако с тех пор OpenOffice прошел долгий путь от очередного приложения с открытым кодом до полноценного пакета эффективных и безопасных офисных приложений. Кроме того, он обладает такими преимуществами, как бесплатность и расширяемость, а также получает поддержку со стороны таких компаний-гигантов, как Sun Microsystems и с недавних пор IBM.

Данное руководство посвящено одной из возможностей расширения функциональности OpenOffice,заключающейся в использовании фильтров XML и XSLT для создания подключаемых модулей, позволяющих редактировать любые данные в формате XML. Таким образом, вы получаете возможность сочетать преимущества хранения данных в XML – формате, поддерживающем автоматическую обработку, а редактирования – в формате, удобном для человеческого восприятия. XML делает возможным быстрый поиск и извлечение информации, а также обеспечивает семантический контекст, в то время как редактирование по-прежнему происходит в удобной гипертекстовой среде.

Ниже мы расскажем о том, как OpenOffice взаимодействует с XML, опираясь на формат OpenDocument. Затем мы перейдем к созданию фильтров импорта и экспорта. Первый необходим для загрузки документов в OpenOffice, а второй – для их сохранения.

В качестве конкретного формата, основанного на XML, мы выбрали известный Интернет-стандарт VCARD, описанный в документе RFC2426. VCARD используется в частности в приложениях iCal от Apple и Outlook от Microsoft для представления визитных карточек и записей в адресных книгах. Несмотря на то, что XML-представление VCARD пока не стандартизировано, автор долгое время работал с ним в процессе создания Web-ориентированного рабочего стола (см. раздел "Об авторе"). К тому же обратное преобразование из XML в текстовое представление VCARD не представляет никаких трудностей.

Предварительные требования

В процессе чтения руководства вам понадобятся следующие приложения:

  • OpenOffice версии 2.0 или выше. Примеры к руководству были созданы в последней версии OpenOffice (2.2). После этого была выпущена версия 2.3, в которой были исправлены серьезные проблемы с безопасностью, связанные с некорректной работой с форматом TIFF. Все примеры были протестированы на предмет работы в OpenOffice 2.3.
  • Редактор XML для работы с файлами XML и XSLT. Автор предпочитает vim при работе в UNIX® и Notepad – в Windows®.

Введение

Этот раздел посвящен введению в OpenDocument – формату для представления документов OpenOffice, основанному на XML. Данное руководство не претендует на полноту описания, но, тем не менее, прочитав его, вы сможете ориентироваться во множестве XML-элементов, использующихся в OpenDocument.

Манипулирование данными в OpenOffice

Родной форматом данных в OpenOffice является OpenDocument. Файлы OpenDocument, как правило, имеют расширение .odt, но на самом деле представляют собой всего лишь архивы ZIP. Для того чтобы заглянуть внутрь файла .odt распакуйте его при помощи утилиты командной строки unzip или, если вы работаете в Windows, то откройте его в приложении WinZip или WinrRar. Пример типичного содержимого архива показан в листинге 1.

Листинг 1. Пример содержимого архива OpenDocument
J@LocalHost (~)# unzip -t Untitled.odt
Archive:  Untitled.odt
    testing: mimetype                 OK
    testing: Configurations2/statusbar/   OK
    testing: Configurations2/accelerator/current.xml   OK
    testing: Configurations2/floater/   OK
    testing: Configurations2/popupmenu/   OK
    testing: Configurations2/progressbar/   OK
    testing: Configurations2/menubar/   OK
    testing: Configurations2/toolbar/   OK
    testing: Configurations2/images/Bitmaps/   OK
    testing: content.xml              OK
    testing: styles.xml               OK
    testing: meta.xml                 OK
    testing: Thumbnails/thumbnail.png   OK
    testing: settings.xml             OK
    testing: META-INF/manifest.xml    OK
No errors detected in compressed data of Untitled.odt.

Основной интерес представляют файлы XML, представленные в таблице 1.

Таблица 1. Ключевые файлы XML
ФайлОписание
content.xmlСодержимое документа, представленное в XML (более подробная информация представлена ниже).
styles.xmlСтили, ассоциированные с документом, в частности, директивы форматирования, стили шрифтов, настройки абзацев и так далее. Эти элементы определены в нескольких пространствах имен.
meta.xmlМета-данные документа, в частности, создатель, дата создания, циклы редактирования и так далее. Все элементы принадлежат пространству имен meta. urn:oasis:names:tc:opendocument:xmlns:meta:1.0.
settings.xmlРазличные настройки режима просмотра и печати. Например, элемент, задающий размеры области для просмотра (высоту, ширину, координаты верхнего левого угла), определен в пространстве имен urn:oasis:names:tc:opendocument:xmlns:config:1.0.
manifest.xmlВыполняет функцию, аналогичную манифесту в файлах .jar, то есть содержит список всех файлов в данном архиве. Каждый файл описывается элементом manifest:file-entry, определенным в пространстве имен urn:oasis:names:tc:opendocument:xmlns:manifest:1.0.

Далее обратимся к простому примеру, демонстрирующему структуру документов OpenOffice. Рассмотрим одностраничный документ, содержащий три текстовых области (рисунок 1).

Рисунок 1. Базовый пример документа OpenOffice
Basic structure of an OpenOffice document

Файл в формате OpenDocument для данного документа представляет собой zip-архив, аналогичный показанному в листинге 1. Основной интерес представляет файл content.xml. Сам файл достаточно длинный, поэтому имеет смысл разбить его на составные части. Ссылка на полезное обсуждение некоторых аспектов формата OpenDocument приведена в разделе Ресурсы. Кроме того, там же можно найти ссылку на официальную спецификацию формата OpenDocument.

В таблице 2 показана структура документа OpenOffice

Таблица 2. Содержимое документов OpenOffice
Элемент XMLОписание
office:document-contentПредставляет собой корневой элемент документа OpenOffice. В его атрибутах задаются используемые пространства имен. Атрибут office:version указывает на версию OpenDocument (1.0 или 1.1).
office:scriptsСодержит различные скрипты, находящиеся в документе (как правило, пуст).
office:font-face-declСодержит объявления шрифтов, использующихся в документе, в виде массива элементов <style:font-face>.
office:automatic-stylesАвтоматические стили (если таковые используются). В данную категорию попадают стили, определенные внутри содержимого документа, а не в файле styles.xml.
office:body The document bodyЧасть содержимого документа, видимая для пользователя.
text:sequence-declsМассив тегов text:sequence-decl, которые описывают, какие элементы должны отображаться на разных уровнях оглавления документа.

Объявления пространств имен для каждого из этих элементов показано в листинге 2.

Листинг 2. Пространства имен элементов
<office:document-content 
  xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
  xmlns:vcf="me.me.me.vcf" 
  xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
  xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
  xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
  xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
  xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
  xmlns:xlink=http://www.w3.org/1999/xlink   
  xmlns:dc="http://purl.org/dc/elements/1.1/" 
  xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
  xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
  xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
  xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
  xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
  xmlns:math=http://www.w3.org/1998/Math/MathML   
  xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
  xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
  xmlns:ooo="http://openoffice.org/2004/office" 
  xmlns:ooow="http://openoffice.org/2004/writer" 
  xmlns:oooc="http://openoffice.org/2004/calc" 
  xmlns:dom="http://www.w3.org/2001/xml-events" 
  xmlns:xforms="http://www.w3.org/2002/xforms" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  office:version="1.0">

Эти пространства имен представляют собой уникальные идентификаторы элементов OpenOffice. Каждый элемент содержит префикс пространства имен для избежания конфликтов с одноименными элементами HTML, например, <p> или <h>.

Помните, что данные объявления нельзя никоим образом изменять. Несмотря на то, что идентификаторы (URN) не обязаны представлять собой полноценные указатели на ресурсы, многие парсеры XML, особенно XSLT-процессоры, работают только в случае, если идентификаторы точно соответствуют показанным выше.

Далее в документе содержатся объявления шрифтов по умолчанию (листинг 3).

Листинг 3. Объявления шрифтов
<office:font-face-decls>
<style:font-face style:name="Lucidasans1" svg:font-family="Lucidasans"/>
<style:font-face style:name="Nimbus Roman No9 L" 
    svg:font-family="'Nimbus Roman No9 L'" style:font-family-generic="roman"
    style:font-pitch="variable"/>
<style:font-face style:name="Nimbus Sans L" 
    svg:font-family="'Nimbus Sans L'" style:font-family-generic="swiss" 
  style:font-pitch="variable"/>
<style:font-face style:name="Lucidasans" svg:font-family="Lucidasans" 
    style:font-family-generic="system" style:font-pitch="variable"/>
<style:font-face style:name="Nimbus Sans L1" 
    svg:font-family="'Nimbus Sans L'" style:font-family-generic="system" 
  style:font-pitch="variable"/>
</office:font-face-decls>

Пусть вас не пугает многообразие идентификаторов и атрибутов, так как вам достаточно будет просто скопировать их, не редактируя.

Элемент automatic-style, содержащий список стилей, вложенных непосредственно в документ, показан в листинге 4.

Листинг 4. Элемент automatic-styles
<office:automatic-styles>
<style:style style:name="VCardTable" 
    style:family="table"><style:table-properties 
  style:width="4.6667in" fo:margin-left="0in" fo:margin-right="2.2583in" 
  table:align="margins" style:shadow="none"/></style:style>
<style:style style:name="VCardTable.A" 
    style:family="table-column"><style:table-column-properties 
  style:column-width="1.8438in" 
  style:rel-column-width="2655*"/></style:style>
<style:style style:name="VCardTable.B" style:family="table-column">
    <style:table-column-properties style:column-width="1.2604in" 
  style:rel-column-width="1815*"/></style:style>
<style:style style:name="VCardTable.C" style:family="table-column">
    <style:table-column-properties style:column-width="1.559in" 
  style:rel-column-width="2245*"/></style:style>
<style:style style:name="VCardTable.A1" style:family="table-cell">
    <style:table-cell-properties fo:padding="0.0382in" fo:border="none"/>
  </style:style>
<style:style style:name="VCardTable.C1" style:family="table-cell">
    <style:table-cell-properties fo:background-color="transparent" 
  fo:padding="0.0382in" fo:border="none"><style:background-image/>
  </style:table-cell-properties></style:style>
<style:style style:name="P1" style:family="paragraph" 
    style:parent-style-name="Standard"><style:paragraph-properties 
  fo:background-color="transparent"><style:background-image/>
    </style:paragraph-properties></style:style>
<style:style style:name="P2" style:family="paragraph" 
    style:parent-style-name="Table_20_Contents"><style:text-properties 
  fo:font-size="16pt" style:font-size-asian="16pt" 
  style:font-size-complex="16pt"/></style:style>
<style:style style:name="P3" style:family="paragraph" 
    style:parent-style-name="Table_20_Contents"><style:paragraph-properties 
  fo:text-align="end" style:justify-single-word="false" 
  fo:background-color="transparent"><style:background-image/>
</style:paragraph-properties><style:text-properties fo:color="#800000" 
    fo:font-style="normal" style:text-underline-style="none" 
       style:font-style-asian="normal"  
  style:font-style-complex="normal"/></style:style>
</office:automatic-styles>

Показанные выше стили автоматически добавляются OpenOffice в файл content.xml в момент создания таблицы. Необходимо отличать данные стили по умолчанию от стилей, создаваемых пользователями. Последние сохраняются в файле styles.xml.

Наконец, содержимое документа показано в листинге 5.

Листинг 5. Содержимое документа
     <office:body>
       <office:text>
         <!- Объявления различных последовательностей опущены !--> 
         <office:forms form:automatic-focus="false" 
                       form:apply-design-mode="false" /> 
         <text:h text:style-name="Heading_20_1" 
                 text:outline-level="1">Hello,OpenDoc!</text:h>
         <text:h text:style-name="Heading_20_2" 
                 text:outline-level="2">(Hello again, H2)</text:h>
        <text:p text:style-name="Text_20_body">.. and again!</text:p>
    </office:text>
  </office:body>

Элементы <text:h> и <text:p> обозначают текстовые области и абзацы соответственно. За исключением пространств имен они аналогичны элементам <h> и <p> в HTML. Оба элемента могут содержать атрибут style-name, в котором указывается имя одного из стилей документа, определенного либо в <automatic-styles>, как показано в листинге 4, либо во внешнем файле styles.xml.

Не стоит паниковать. Да, в OpenDocument используется немало элементов XML, но следует всегда помнить о двух вещах:

  1. Несмотря на множество пространств имен, сами документы .odt обладают достаточно простой структурой, которая состоит из элементов <text:h>, содержащих редактируемый текст, с атрибутами text:style-name, задающими имена стилей. Разумеется, это упрощенный пример - многие документы обладают значительно более сложной структурой, содержащей таблицы, изображения и различные гипертекстовые фрагменты. Однако они подчиняются тем же простым принципам, что и остальные документы в формате OpenDocument.
  2. Большая часть работы по созданию фильтра заключается в копировании XML-элементов из документа OpenDocument в XSLT-шаблон при минимальной необходимости редактирования XML.

Несмотря на всю громоздкость формата OpenDocument, работать с ним не так сложно, как может показаться. В этом могут существенно помочь средства для автоматической обработки содержимого документов. Одним из таких средств является XSLT.


Введение в XSLT

Таким образом, при всей своей кажущейся сложности, OpenDocument представляет собой всего лишь диалект XML. Это крайне важно, так как открывает бесчисленные возможности для автоматической обработки документов. Одной из ключевых возможностей является использование языка стилевых преобразований XML (XSLT). Он представляет собой мощный инструмент для преобразования любых документов XML в произвольный текстовый формат, в том числе и XML. Более того, вы также можете создавать шаблоны XSLT для конвертирования ваших данных в формате XML в документы OpenDocument, получая тем самым возможность использования всех преимуществ гипертекста.

В OpenOffice XSLT используется в качестве механизма для преобразования сторонних документов в формат OpenDocument и обратно. Причины такого выбора очевидны: XSLT был создан специально для обработки данных в XML. Неважно, как именно выглядят ваши данные, если они могут быть представлены в корректно сформированном документе XML, то все что вам остается – это создать правильную XSLT-страницу для необходимой обработки.

Два типа фильтров

В OpenOffice было введено понятие фильтров, которые используются при работе с данными в формате XML. Они представляют собой не что иное, как страницы XSLT. Для каждого типа документов требуются два фильтра: для импорта и для экспорта.

  • Фильтр импорта – это страница XSLT, которая транслирует исходный XML-документ в формат OpenDocument, пригодный для редактирования. Страница фактически является шаблоном OpenDocument, применяя стили OpenDocument к исходному документу в процессе преобразования.
  • Фильтр экспорта выполняет обратную задачу, преобразуя текстовое содержимое документа в формате OpenDocument в необходимый формат. Обычно таковым является диалект XML, но при помощи директивы <xsl:text> можно генерировать результат в любом текстовом (а в теории даже бинарном) формате.

Более подробную информацию о фильтрах OpenOffice можно найти, обратившись по ссылкам в разделе Ресурсы. Далее, как было обещано во вводной части руководства, мы будем использовать оба вида фильтров.

Ударный курс XSLT

Если вы не знакомы с XSLT или сумели вычеркнуть его из памяти, то стоит сделать паузу и вспомнить его базовые принципы. При этом подробное описание стандарта XSLT выходит за рамки данного руководства (ссылка на документацию приведена в разделе Ресурсы).

XSLT – это специальный диалект XML, описанный в пространстве имен xsl:namespace. Основной функцией XSLT является преобразование элементов XML из одной формы в другую. Это достигается путем использования шаблонов – элементов xsl:template. Существует несколько простых правил, регламентирующих их использование.

  1. Каждая страница XSLT обязана содержать один "стартовый" шаблон, как показано в листинге 6.
    Листинг 6. Стартовый шаблон
    <xsl:template match="/">
      .. . . .
    </xsl:template>

    Этот шаблон выполняет функцию точки входа. Он соответствует корневому элементу XML-документа, к которому применяется страница.
  2. Остальные шаблоны могут быть одного из следующих двух типов:
    1. Шаблоны, которые соответствуют элементам XML в исходном документе, например, шаблон <xsl:template match="elem">, применяемый при помощи <xsl:apply-templates match="/path/to/elem" />.
    2. Шаблоны, вызываемые по имени, например, шаблон <xsl:template name="x">, вызываемый при помощи <xsl:call-template name="x" />.
  3. Результатом выполнения XSLT в точности является содержимое вызываемых и применяемых шаблонов. При этом существует одно важное исключение: если явно не использовать элемент <xsl:text> или конструкцию <![CDATA[", то результатом будет корректно сформированный документ XML.
  4. Результирующие XML-элементы могут создаваться неявно, то есть при заключении текста внутрь угловых скобок, либо явно, при помощи директивы <xsl:element>.
  5. Для генерации содержимого выходных XML-документов или вывода значений исходных элементов служит директива <xsl:value-of>, указывающая на элементы входного документа при помощи выражений XPath. Язык XPath – это отдельная обширная тема, но для наших целей необходимо только помнить, что в выражениях XPath можно использовать имена элементов и атрибутов (последним должен предшествовать префикс @).
  6. Управление процессом применения шаблонов в XML весьма ограничено и специально адаптировано под задачу обхода дерева. Для организации циклов по наборам элементов служит директива <xsl:for-each>, а для проверки условий – директивы <xsl:if> и <xsl:choose>.

Синтаксис XSLT весьма непрост, а также страдает от ограничений, накладываемых структурой XML-документов, так как каждая страница XSLT обязана представлять собой корректно сформированный документ XML. Добавьте к этому необходимость изучения элементов XSLT, ограничения на использования переменных и нетривиальные конструкции переходов, и вы поймете, почему многие разработчики стараются использовать альтернативные решения. Одной из альтернатив является использование модели DOM в языках высокого уровня, например, Java™ или JavaScript. Однако, как вы скоро увидите, умение использовать XSLT оказывается исключительно полезным при работе с OpenOffice. При этом всего лишь базовых знаний, не затрагивающих сложные вопросы и действительно мощные возможности XSLT, будет достаточно для создания гибких фильтров импорта/экспорта.


Фильтр импорта

В этом разделе по шагам разбирается процесс разработки фильтра импорта. После описания необходимых элементов XML мы перейдем к созданию структуры фильтра в формате OpenDocument. Затем останется создать на основе этой структуры страницу XSLT, а также установить ее в качестве фильтра.

Формат данных XML

Создание фильтра импорта в высокой степени определяется структурой импортируемых данных, поэтому ее необходимо тщательно изучить перед тем, как приступать непосредственно к разработке самого фильтра. В нашем примере будет использоваться XML-формат, схожий с форматом VСard, применяющимся в Jabber (ссылка на спецификацию приведена в разделе Ресурсы), но имеющий некоторые отличия. Несмотря на то, что это нестандартный формат, он достаточно прост и ясен. Пример приведен в листинге 7.

Листинг 7. Пример документа в формате VCard
<CONTACT>
        <VERSION>3.14</VERSION>
        <FN>Simpson, Homer</FN>
        <EMAIL>
<TYPE>Internet</TYPE>
<TYPE>PREF</TYPE>
HomerJ@Simpsons.tv</EMAIL>
        <NICKNAME>Home-e</NICKNAME>
        <X-JADE-GROUP>The Simpsons</X-JADE-GROUP>
        <ADR>
          <TYPE>Work</TYPE>
          <TYPE>Postal</TYPE>
          <POBOX></POBOX>
          <EXT></EXT>
          <NUMBER>742</NUMBER>
          <STREET>Evergreen Terrance</STREET>
          <LOCALITY>Springfield</LOCALITY>
          <REGION>MA</REGION>
          <ZIP></ZIP>
          <COUNTRY>USA</COUNTRY>
        </ADR>
        <PHONE work="true">(413)-555-3323</PHONE>
</CONTACT>

Генерация каркаса фильтра в формате OpenDocument

Страницу XSLT проще всего создать на основе шаблона документа OpenDocument, так как именно к этому виду будут преобразовываться документы VCard. Для этого достаточно создать простой текстовый документ и выбрать пункт меню File>Save As. Пример документа, содержащего тестовые данные, показан на рисунке 2.

Рисунок 2. Шаблон OpenDocument, содержащий тестовые данные
OpenDocument Template document with sample data

Получившийся в итоге файл content.xml, в котором находится исключительно содержимое документа, приведен в листинге 8.

Листинг 8. Содержимое файла content.xml
<table:table table:name="VCardTable" table:style-name="VCardTable">
  <table:table-column table:style-name="VCardTable.A"/>
  <table:table-column table:style-name="VCardTable.B"/>
  <table:table-column table:style-name="VCardTable.C"/> 
   <table:table-row>
<table:table-cell table:style-name="VCardTable.A1" office:value-type="string">
<text:p text:style-name="VCF-FN">Simpson, Homer</text:p>
<text:p text:style-name="VCF-NICKNAME">Home-y</text:p>
<text:p text:style-name="VCF-TITLE">Nuclear Plant Engineer</text:p>
</table:table-cell>
<table:table-cell></table:table-cell>
<table:table-cell>
<table:table table:is-sub-table="true">
<table:table-column table:style-name="VCardTable.C"/>
<table:table-row>
<table:table-cell table:style-name="VCardTable.C1.1.1" office:value-type="string">
<text:p text:style-name="VCF-CATEGORY">The Simpsons</text:p>
</table:table-cell>
</table:table-row>
</table:table>
</table:table-cell>
</table:table-row>
<table:table-row>
<table:table-cell table:style-name="VCardTable.A1" office:value-type="string">
<text:h text:style-name="VCF-ADR-NUMBER">742 </text:h>
<text:h text:style-name="VCF-ADR-STREET">Evergreen Terrace</text:h>
<text:h text:style-name="VCF-ADR-LOCALITY">Springfield</text:h>
<text:h text:style-name="VCF-ADR-REGION">MA</text:h>
<text:h text:style-name="VCF-ADR-ZIP"> 01118</text:h>
<text:h text:style-name="VCF-ADR-COUNTRY">United States</text:h>
</table:table-cell>
<table:table-cell table:style-name="VCardTable.A1" table:number-columns-spanned="2" 
           office:value-type="string">
<text:p text:style-name="VCF-PHONE">Work: (413)-555-3223</text:p>
</table:table-cell><table:covered-table-cell/>
</table:table-row>
<table:table-row>
<table:table-cell table:style-name="VCardTable.A1" office:value-type="string">
<text:p text:style-name="VCF-EMAIL">HomerJ@simpsons.tv</text:p>
</table:table-cell>
<table:table-cell table:style-name="VCardTable.A1" table:number-columns-spanned="2" 
          office:value-type="string"><text:p text:style-name="Standard"/>
      </table:table-cell><table:covered-table-cell/>
</table:table-row>
</table:table>

Возможно, вы поразитесь сложности данной XML-структуры, особенно из-за множества непонятных элементов типа <table:table..>. Однако, если вы помните, как работают таблицы в HTML, то разобраться с таблицами в OpenOffice будет не так уж сложно. В целом, они работают в соответствии с тремя базовыми принципами.

  1. Все элементы таблиц принадлежат пространству имен table (xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0").
  2. Элементы соответствуют табличным элементам в HTML: table:table = <TABLE>, table:table-row = <TR>, table:table-cell = <TD>, table:number-columns-spanned = colspan
  3. Каждый элемент table:style-name задает стиль, определенный в office:automatic-styles. В нашем случае используется стиль "invisible", отключающий границы ячеек таблицы.

Повторим еще раз, что самое главное при работе с OpenDocument, как в этом руководстве, так и вообще, - это не обращать внимания на сложную структуру XML, состоящую из множества вложенных элементов. По сути, она не имеет значения, потому что приходится изменять только содержимое элементов, а не саму структуру.

Далее каждый элемент text:h необходимо поместить в нужный семантический контекст. Для этого можно использовать стили, например, стандартные Heading 1, Heading 2 или создать собственные. В качестве альтернативы в элементы text:h можно добавить собственные атрибуты, которые могут содержать произвольные значения. В данном примере был выбран первый вариант. Самое главное при этом – это не формат стилей, а факт их наличия, потому что стилевые теги нужны для того, чтобы распознавать различные текстовые элементы в процессе импорта, при восстановлении исходной структуры XML-документа.

Если вы загрузили документ, использующийся в качестве примера, то откройте его в OpenOffice и нажмите F11, вызвав диалог для управления стилями и форматированием (Styles and Formatting). Выбрав в списке элемент Custom Styles, вы увидите имена всех объявленных стилей, причем каждое начинается с префикса “VCF” для удобства (рисунок 3). Все эти стили объявлены в файле styles.xml.

Рисунок 3. Диалог "Styles and Formatting" в Open Office
Styles and Formatting

Обратите внимание на описание стилей в XML, показанное в листинге 9.

Листинг 9. Объявление стилей
<style:style style:name="VCF-ADR-COUNTRY" 
style:family="paragraph" style:parent-style-name="Standard" style:class="extra"/>
..
<style:style style:name="VCF-ADR-STREET" 
style:family="paragraph" style:parent-style-name="Standard" style:class="extra"/>
..
<style:style style:name="VCF-NICKNAME" 
style:family="paragraph" style:parent-style-name="Standard" 
style:class="extra"><style:text-properties fo:font-size="16pt" 
style:font-size-asian="16pt" style:font-size-complex="16pt"/></style:style>

Теперь становится понятно, что обозначают имена классов, выделенные заглавными буквами в листинге 8. Как видите, эти имена, использующиеся в качестве значений элементов text:style-names представляют собой не что иное, как VCF-имена стилей. Данные стили были определены в момент создания структуры документа OpenDocument.

Еще более широкие возможности для описания семантики данных открываются при использовании атрибутов. Основная прелесть атрибутов в XML заключается в том, что, если вы не знаете, как их использовать, можно считать, что их просто нет. Они попросту игнорируются OpenOffice и никак не влияют на работу с документом. Однако, OpenOffice не безгрешен, что выражается в частности в том, что атрибуты иногда теряются в процессе преобразования документов. Поэтому лучше использовать стили, несмотря на то, что их необходимо объявлять. Это можно сделать одним из следующих двух способов:

  1. Описать все стили при помощи графического интерфейса OpenOffice (диалога для редактирования стилей и форматирования, вызываемого по нажатию F11). Затем можно присвоить имя каждому стилю, очистить содержимое документа и сохранить его в качестве шаблона OpenOffice (файла с расширением .ott). Далее данный шаблон можно добавить в качестве дополнительного файла в процессе установки фильтра.
  2. Добавить объявления стилей непосредственно внутрь документа. Для этого служат элементы <style:style> внутри блока <office:automatic-styles>. При этом каждый элемент style:style выглядит подобно следующему: <style:style style:name="VCF-ADR-COUNTRY" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"/>.

В итоге все стили в блоке <office:automatic-styles> можно добавить в сгенерированный файл в формате OpenDocument.

В данном примере мы будет использовать более простой, хотя и требующий дополнительных файлов, первый вариант. Поэтому, если вы загрузили или создали тестовый документ самостоятельно, то также обратите внимание и на файл с расширением .ott.

Создание XSLT-фильтра для импорта данных

Закончив с каркасом фильтра в формате OpenDocument, можно переходить непосредственно к созданию XSLT-фильтра импорта. Сам процесс достаточно очевиден, хотя и требует немалого объема работы, заключающейся в следующих шагах:

Шаг 1: Заключить шаблон OpenDocument внутрь директив XSLT, как показано в листинге 10.

Листинг 10. Каркас OpenDocument внутри директив XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="/">
 
   <!-- Insert OpenDocument from context.xml here - cut and paste !-->

</xsl:template>

</xsl:stylesheet>

Шаг 2: На данном этапе имеет смысл опробовать фильтр в работе, чтобы убедиться в корректности синтаксиса XSLT-страницы. Если вы протестируете фильтр так, как показано ниже, то в результате должен получиться исходный документ в формате OpenDocument. Кроме того, корректность страницы XSLT можно проверить в любом Web-браузере, добавив строчку <?xml-stylesheet href="xvcf.xsl" type="text/xsl"?> в начало XML-файла (листинг 11).

Листинг 11. Проверка корректности XSLT при помощи встроенных средств Web-браузера
<?xml version="1.0"?>.
<?xml-stylesheet href="xvcf.xsl" type="text/xsl"?>
<VCARD>
...

Пошаговое тестирование страницы XSLT крайне важно. Если в странице допущены ошибки с точки зрения стандарта XSLT, то произойдет одно из двух: либо OpenOffice откроет файл в виде обычного XML-документа, либо сгенерирует исключение и зависнет. К сожалению, подобное иногда происходит даже в специальной среде для тестирования XSLT, предоставляемой OpenOffice, поэтому лучше использовать поддержку XSLT в браузере.

Шаг 3: Далее необходимо перебрать все текстовые абзацы (элементы text:h) и заменить их XML-элементами из импортируемого файла. Для итерирования по этим элементам мы будем использовать директиву xsl:for-each, поддерживая тем самым возможность включения нескольких объектов VCard в один документ. Кроме того, данная директива помогает сфокусироваться на каждом объекте VCard, позволяя обращаться к его дочерним элементам по относительному пути XPath. Доступ к значениям элементов осуществляется при помощи конструкции <xsl:value-of>.

Это достаточно простой, но требующий повышенного внимания к деталям процесс. В результате фрагмент страницы, приведенный в листинге 12, примет вид, как показано в Listing 13.

Листинг 12. Замена текстовых областей на соответствующие элементы XML
<text:p text:style-name="VCF-FN">Simpson, Homer</text:p>
<text:p text:style-name="VCF-NICKNAME">Home-y</text:p>
<text:p text:style-name="VCF-TITLE">Nuclear Plant Engineer</text:p>

Результат показан в листинге 13.

Листинг 13. Результат замены текстовых областей элементами XML
<text:p text:style-name="VCF-FN">
<xsl:value-of select="./FN" />
</text:p>
<text:p text:style-name="VCF-NICKNAME">
<xsl:value-of select="./NICKNAME"/>
</text:p>
<text:p text:style-name="VCF-TITLE">
<xsl:value-of select="./TITLE" />
</text:p>

Аналогичным образом, для преобразования XML-фрагмента с адресами, показанного в листинге 14, выполните шаги с первого по третий.

Листинг 14. Фрагмент XSLT для преобразования адресов
Address(es):
     <xsl:for-each select="/ADR">
          <text:h text:style-name="VCF-NUMBER">
         <xsl:value-of select="./NUMBER" /></text:h> 
          <text:h text:style-name="VCF-STREET">
         <xsl:value-of select="./STREET" /></text:h> 
          <text:h text:style-name="VCF-LOCALITY">
         <xsl:value-of select="./LOCALITY" /></text:h> 
          <text:h text:style-name="VCF-REGION">
         <xsl:value-of select="./REGION" /></text:h>
<text:h text:style-name="VCF-ZIP"><xsl:value-of select="./ZIP" /></text:h>
          <text:h text:style-name="VCF-COUNTRY">
      <xsl:value-of select="./COUNTRY" /></text:h>
     </xsl:for-each>

В результате, элемент ADR, содержащийся в импортируемом файле (листинг 15), будет трансформирован во фрагмент, показанный в листинг 16.

Листинг 15. Элемент ADR
  <ADR>
          <TYPE>Work</TYPE>
          <TYPE>Postal</TYPE>
          <POBOX></POBOX>
          <EXT></EXT>
          <NUMBER>742</NUMBER>
          <STREET>Evergreen Terrance</STREET>
          <LOCALITY>Springfield</LOCALITY>
          <REGION>MA </REGION>
          <ZIP></ZIP>
          <COUNTRY>USA</COUNTRY>
        </ADR>

Результат преобразования элемента ARD показан в листинге 16.

Листинг 16. Результат преобразования элемента ADR
          <text:h text:style-name="VCF-NUMBER">742</text:h> 
          <text:h text:style-name="VCF-STREET">Evergreen Terrace</text:h> 
          <text:h text:style-name="VCF-LOCALITY">Springfield</text:h> 
          <text:h text:style-name="VCF-REGION">MA</text:h>
          <text:h text:style-name="VCF-COUNTRY">USA</text:h>

Данный фрагмент OpenDocument выглядит в точности так же, как и в исходном тестовом документе.

Обратите внимание, что формируя корректные с точки зрения OpenOffice фрагменты XML, мы сохраняем всю семантическую информацию, в данном случае, путем добавления атрибутов style-name в элементы text:h.

Здесь необходимо учесть, что выражение value-of также возвращает содержимое дочерних элементов текущего узла. Так как некоторые свойства элементов в импортируемом файле реализованы в виде дочерних элементов, то их необходимо отфильтровать. Для этих целей удобно использовать функцию text() в XPath, так как она игнорирует дочерние элементы и возвращает исключительно текстовое содержимое текущего узла. Например, допустим, текущей вершиной является корневой элемент CONTACT, и нам требуется вывести содержимое одной из его дочерних вершин. Для этого стоит использовать выражение <xsl:value-of select="/ELEM/text()" /> вместо <xsl:value-of select="/ELEM" />, которое вдобавок к тексту также вернет и дочерние элементы.

Возникает вопрос, а что делать в случае отсутствия содержимого в каком-либо элементе, например, если не задан номер телефона? Для обработки таких ситуаций можно использовать конструкции для условных переходов в XSL, а именно: <xsl:if> и<xsl:choose>. Мы будем использовать второй вариант из-за того, что в конструкции <xsl:if> не предусмотрен блок else. В результате фрагмент XSL для импортирования телефонных номеров примет вид, показанный в листинге 17.

Листинг 17. Преобразование элементов Phone
<text:p text:style-name="VCF-PHONE">
 <xsl:choose>
    <xsl:when test="./PHONE">
      <xsl:value-of select="./PHONE" />
    </xsl:when>
    <xsl:otherwise>
         No Phone Specified
    </xsl:when>
</text:p>

Поскольку все описанные выше фрагменты XSL будут повторяться, то имеет смысл создать именованный шаблон (листинг 18)

Листинг 18. Создание именованного шаблона XSLT
<xsl:template 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
      name="ShowField">
      <xsl:param name="FieldName"/>
      <xsl:param name="FieldValue"/>
     <!-- "Переменная" используется для формирования имени класса стиля !-->
       <xsl:variable name="TextStyle">Text_<xsl:value-of 
     select="$FieldName" /></xsl:variable>

<text:h text:style-name="{$TextStyle}">
    <xsl:choose>
        <xsl:when test="$FieldValue != ''">
<xsl:value-of select="$FieldValue" />
         </xsl:when>
  <xsl:otherwise>
            No <xsl:value-of select="$FieldName" /> specified
       </xsl:otherwise>
     </xsl:choose>
</text:h>
</xsl:template>

Далее его можно будет вызывать по имени для каждого элемента (листинг 19).

Листинг 19. Вызов щаблона по имени для каждого элемента
<xsl:call-template name="ShowField">
<xsl:with-param name="FieldName">FN</xsl:with-param>     
<xsl:with-param name="FieldValue">
<xsl:value-of select="./FN"/></xsl:with-param>
</xsl:call-template>

Использование фильтра импорта

Итак, работа над поддержкой нового формата XML в OpenOffice практически закончена. Все что осталось – это установить фильтр импорта, ассоциировав его с файлами с расширением .xvcf. К счастью, это совсем несложно.

  1. Откройте меню Tools и выберите пункт XML filter settings (рисунок 4).
    Рисунок 4. Диалог "XML filter settings"
    XML filter settings
    1. Выберите расширение импортируемых файлов, в данном случае – xvcf.
    2. Выберите только что созданную страницу XSLT в качестве фильтра импорта.
  2. Если вы использовали шаблон для описания необходимых стилей, то выберите его в поле "template for import". Он представляет собой пустой документ в формате OpenDocument, содержащий все объявления стилей и сохраненный в виде OpenOffice Template (файл .ott).
    Рисунок 5. Выбор шаблона OpenOffice
    Selecting your OpenOffice template
  3. При желании вы можете протестировать XSLT, нажав на кнопку Test XSLT после добавления нашего фильтра в список фильтров импорта.
  4. Теперь можно проверить, поддерживается ли формат VCard, нажав на кнопку Open. Должен появиться диалог, схожий с показанным на рисунке 6.
    Рисунок 6. Проверка поддержки формата VCard
    Testing the XSLT

Фильтр экспорта и преобразование в другие форматы

Теперь, установив фильтр для импортирования XML-данных в OpenOffice, можно переходить к созданию фильтра экспорта для преобразования данных в исходный формат. Освоив данный вид преобразования, вы также научитесь описывать и другие, в частности, создавать страницы XSLT для экспорта данных в любой требующийся формат XML.

Создание фильтра экспорта

Закончив редактирование визитных карточек VCard, вам наверняка захочется их сохранить, причем, скорее всего, в их родном формате XML. Несмотря на то, что данное представление не очень удобно для чтения, оно оказывается очень полезным при индексировании или классифицировании записей в соответствии с их семантикой.

Создание фильтра экспорта во многом повторяет процесс разработки фильтра импорта. Как и предыдущий, он представляет собой страницу XSLT, однако ее создание можно облегчить, приняв во внимание следующие детали:

  1. Используйте встроенную в XSLT поддержку отступов в XML. Для этого служит директива <xsl:output method="xml" indent="yes"/>.
  2. Если явно не указано обратное, то XSLT-страницы очень чувствительны к пространствам имен XML. Поскольку пространства имен, использующиеся для стилей в OpenOffice (например, text или draw) не должны экспортироваться, то необходимо явно добавить атрибут exclude-result-prefixes="text draw " в элемент xsl:stylesheet.
  3. Начинайте преобразование документа с элемента body. Как видно из листинга 2, данный элемент находится внутри элемента document, причем оба принадлежат пространству имен office (листинг 20).
    Листинг 20. Пространство имен office
    <xsl:template match="/">
        <xsl:apply-templates select="office:document/office:body/">
    </xsl:template>
  4. Далее обратите внимание на семантический контекст каждого элемента text:h, так как без него у вас не получится воссоздать изначальную структуру XML и имена элементов. Именно на этом шаге нам потребуются те самые специальные стили, которые мы объявляли выше. Помните, в процессе создания фильтра импорта мы определяли семантический контекст каждого элемента? Теперь мы будем его использовать для обратного преобразования и воссоздания первоначальных элементов. Пример показан в листинге 21.
    Листинг 21. Воссоздание изначального формата элементов
    <xsl:template match="office:body">
        <VCARD>
        <xsl:for-each select="text:p">
          <!-- Loop over all the text:p elements 
             and cast them into the original context !-->
         <xsl:if test="@text:style-name='VCF-FN'">
              <xsl:element name="FN">
               <xsl:value-of select="." />
              </xsl:element><!-- FN !-->
         </xsl:if>
    ...
         <xsl:if test="@text:style-name='VCF-NUMBER'">
              <xsl:element name="NUMBER">
               <xsl:value-of select="." />
              </xsl:element><!-NUMBER !-->
         </xsl:if>
    ...
        </xsl:for-each>
        </VCARD>
    
    </xsl:template>

Этот фрагмент придется повторить для всех элементов text:h и text:p. Несомненно, для этого потребуется немалый объем кода. Его можно сократить при помощи фрагмента, показанного в листинге 22, но он также выглядит не очень привлекательно.

Листинг 22. Короткий фрагмент XSL для преобразования элементов
<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
>
<xsl:template match="/">

<xsl:for-each select="//text:p">
 <xsl:if test="contains(@text:style-name,'VCF')">

<xsl:variable name="ELEMNAME">
   <xsl:value-of select="substring(@text:style-name,5)" /></xsl:variable>
   <xsl:element name="{$ELEMNAME}">
   <xsl:value-of select="$ELEMNAME" />:
   <xsl:value-of select="." />
   </xsl:element>
</xsl:if>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>


</xsl:stylesheet>

В нашей XSLT-странице используется цикл for для перебора всех элементов text:p. При этом их местоположение в иерархии (office:document, office:body, и т.д.) не имеет значения. Благодаря конструкции xsl:if обрабатываются только те элементы, которые помечены стилями с префиксом VCF. Они преобразуются в элементы XVCF, названия которых представляют собой имена стилей без первых четырех символов (префикса “VCF-“), которые отбрасываются при помощи XSLT-функции substring. Аналогичный шаблон будет использоваться для преобразования элементов text:h.

Данная XSLT, как и другие файлы, с которыми вы можете поэкспериментировать, находится в архиве с исходным кодом примеров к данному руководству.

Использование фильтра экспорта

Как и в случае импорта, данный фильтр необходимо установить. Он устанавливается примерно так же, как и фильтр импорта, после чего OpenOffice сможет сохранять данные в формате, из которого они были импортированы. Вся процедура достаточно проста и состоит из следующих шагов:

  1. Выберите пункт XML filter settings в меню Tools.
    • Выберите расширение для файлов, сохраняемых в данном формате, в данном случае – xvcf.
    • Выберите созданную выше страницу XSLT в качестве фильтра экспорта.
  2. Протестируйте XSLT (при желании).
  3. Убедитесь, что теперь нужный формат файлов поддерживается, выбрав в меню пункт Save As.

В качестве проверки фильтров можно провести следующий циклический эксперимент: Для начала импортируйте файл в формате XVCF в OpenOffice. Сохраните получившийся файл .odt. Затем загрузите его и сохраните (при помощи Save As) вновь в формате XVCF. Получившийся в результате файл должен выглядеть так же, как и исходный.

Экспорт в другие форматы

Теперь, освоив данное преобразование, вы не должны иметь трудностей с другими форматами. Следуя тем же принципам, вы можете создавать страницы XSLT для экспорта документов в любые XML-форматы. Кроме того, используя элементы <xsl:text> и <![CDATA[, можно преобразовывать документы в любые текстовые форматы. Как видно из листинга 20, в этом нет ничего сложного. Допустим, нам необходимо сохранять документы в формате VCARD (данный формат описан в RFC2426). В этом случае можно просто выводить записи без родительских элементов, используя блок CDATA, если выходной формат не совместим с XML. В нашей ситуации данный блок не требуется (пример преобразования показан в листинге 23).

Листинг 23. Традиционный способ экспорта при помощи XSLT
<xsl:template match="VCARD">
FN:<xsl:value-of select="./text:h[@style-name='VCF-FN']" />
NICKNAME: <xsl:value-of select="./text:h[@style-name='VCF-NICKNAME']" />
...
</xsl:template>

Обратите внимание на выражения XPath, проверяющие значения атрибутов. С их помощью выбираются нужные элементы на основе их семантического контекста. Это не более чем альтернативный метод обхода XML-дерева. Того же результата можно добиться при помощи цикла <xsl:for-each>. При этом ниже (листинг 24) используется тот же подход, что и в листинге 20.

Листинг 24. Альтернативный метод экспорта
<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
>

<xsl:template match="/">
<xsl:for-each select="//text:p">
<xsl:if test="contains(@text:style-name,'VCF')">

<xsl:variable name="ELEMNAME">
   <xsl:value-of select="substring(@text:style-name,5)" />
</xsl:variable>
   <xsl:value-of select="$ELEMNAME" />:<xsl:value-of select="." 
    /><xsl:text>
</xsl:text>
</xsl:if>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Элементы <xsl:text>, использующиеся в середине фрагмента, служат для вставки символа перевода строки. В результате получаются документы VCF, полностью удовлетворяющие спецификации RFC2426.

Итак, цель достигнута: теперь OpenOffice может импортировать документы XML, преобразуя их к формату OpenDocument, а затем экспортировать обратно в исходный формат.


Заключение

Резюме

В этом руководстве рассказывалось об одной очень мощной возможности OpenOffice – способности работаться с документами любого XML-формата. Это достигается при помощи фильтров импорта и экспорта, которые представляют собой страницы XSLT. Несмотря на сложности XSLT, связанные с ограничениями, накладываемыми XML, и строгим синтаксисом, данный язык позволяет автоматически конвертировать XML-данные в формат, схожий с HTML (или XHTML). Таким образом, можно сочетать ключевые преимущества XML (пригодность для автоматической обработки и возможности описания семантического контекста для отдельных частей документа) с легкостью редактирования документов в расширенном текстовом формате.

Кроме того, мы продемонстрировали использование XSLT для экспорта документов в текстовый формат, отличный от XML, в данном случае – в устаревший формат VCALENDAR. После того, как страницы XSLT созданы и установлены в виде фильтров, их использование сводится к простому выбору пунктов Open или Save As в меню File.


Загрузка

ОписаниеИмяРазмер
Исходный код примеровx-xsltopenoff-source.zip17KБ

Ресурсы

Научиться

  • Оригинал статьи: "Expand the editing capabilities of OpenOffice with XSLT" (Джонатан Левин, developerWorks, октябрь 2007 г.). (EN)
  • Прочитайте статью "Работа с XML-форматом документов, использующимся в OpenOffice" (Роджер Маккой, Roger McCoy, developerWorks, июнь 2007 г.), в которой описываются преимущества XML-формата, используемого в OpenOffice и аналогичных форматах при автоматизированном редактировании документов. (EN)
  • Ознакомьтесь со статьей "Открытый XML-формат файлов для офисных документов" (Уче Огбуйи, Uche Ogbuji, developerWorks, январь 2003 г.), описывающей основы и преимущества ODF. (EN)
  • Спецификация OpenDocument v1.1: Обратитесь к источнику более подробной информации о данной XML-схеме для офисных приложений. Спецификация описывает семантику элементов, а также содержит текстовые документы, таблицы, диаграммы и иллюстрации, в частности, рисунки и презентации (PDF, 11.05 МБ). (EN)
  • Посетите сайт сообщества OpenDocument, содержащий учебный материалы, описывающие различные аспекты формата. (EN)
  • Прочитайте статью в Wikipedia, посвященную формату OpenDocument. (EN)
  • Ознакомьтесь с устоявшейся спецификацией XEP-0054: vcard-temp, описывающей XML-представление формата vCard и использующейся в сообществе Jabber. (EN)
  • Прочитайте 9-ую главу книги "Основы документов Oasis" под названием "Фильтры в OpenOffice.org" (Дж. Дэвид Айзенберг, J. David Eisenberg, O'Reilly Media), в которой описывается область применения XSLT-фильтров, а также вопросы их создания и установки. (EN)
  • Прочитайте исчерпывающее руководство под названием "XSLT: работа с XML и HTML" (Хан И Фун, Khun Yee Fung, Addison-Wesley, декабрь 2000 г.). (EN)
  • Прочитайте статью "Приключения с OpenOffice и XML" (Мэтт Сержант, Matt Sergeant, XML.com, 2001 г.), в которой приводится обсуждение различных скриптовых средств для обработки файлов OpenOffice. (EN)
  • Прочитайте документацию по функциям XSLT на сайте w3school.com. Документация включает описание более сотни встроенных функций, в том числе функций для обработки строк и чисел, функций для сравнения даты и времени, работы с узлами, квалифицированными именами (QNode), последовательностями, булевыми значениями и так далее. (EN)
  • Обратитесь к технической библиотеке XML, содержащей множество статей, советов, руководств, стандартов и справочников IBM Redbooks. (EN)
  • Технические мероприятия и Web-трансляции developerWorks: В этих разделах можно получить самую актуальную информацию о современных технологиях. (EN)
  • Материалы на все темы, касающиеся XML, можно найти в разделе XML на сайте developerWorks.
  • Обратитесь к магазину технической литературы, в котором представлены книги на данную и другие темы. (EN)

Получить продукты и технологии

  • Загрузите OpenOffice и найдите всю необходимую информацию на сайте OpenOffice.org. (EN)
  • Скачайте ознакомительные версии программного обеспечения IBM: Используйте в вашем следующем проекте ознакомительные версии ПО, которые можно скачать прямо с сайта IBM developerWorks. (EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML
ArticleID=471780
ArticleTitle=Расширение возможностей редактирования документов в OpenOffice при помощи XSLT
publish-date=03052010