Написание XSLT для синтеза документов OpenOffice из некоторой базы данных

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

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

Я вижу, что документы OpenOffice, конечно, тоже XML. (MS Office тоже может быть, это вариант, но я пока остановлюсь на OO).

Мой опыт работы с XSLT несколько лет назад не пошел намного дальше, чем базовые уроки.

Я быстро исследовал сеть в поисках OOo DTD, и она более неуловима, чем я думал.

Я был бы признателен за некоторые указания, чтобы начать меня.

1 / Где эти проклятые DTD OpenOffice?

2 / Там должен быть какой-то пример XSLT для OOo. Знаешь кого-нибудь?

3 / Что было бы правильным, хотя процесс? Конечно, я мог бы анализировать исходный XML и генерировать вывод "на лету", элемент за элементом, но это было бы утомительно, и я бы предпочел не идти по этому пути. Моя задача - найти способ написать адекватную таблицу стилей XSLT. С чего мне начать?

Чтобы придать всему этому немного смысла, пожалуйста, приложите упрощенный макет оригинального XML.

<document>
    <metadata>Don't care</metadata>
    <body>
        <sendto>
            <person>Mrs Jane Doe</person>
            <street>Pensylvania Av.</street>
            <number>1234</number>
            <zip>QLD-56789</zip>
            <city>Brisbane</city>
        </sendto>
        <placedate>Bumfuck, AZ, march 29th 2017</placedate>
        <subject>
            Our order #
            <ordernumber>G-27b/6</ordernumber>
        </subject>
        <phrases>
            <phrase>blah</phrase>
            <phrase>bleh</phrase>
        </phrases>
        <order>
            <item>
                <reference>42</reference>
                <name>Bath towel</name>
                <unitprice>4.2</unitprice>
                <quantity>20.0</quantity>
                <totalprice>84.0</totalprice>
            </item>
            <item>...</item>
            ...
            <item>...</item>
            <totalprice>1024.0</totalprice>
        </order>
        <deliverto>
            <person>...</person>
            <street etc.></street>
        </deliverto>
        <phrases>
            <phrase>...</phrase>
            <phrase>Thx, ciao</phrase>
        </phrases>
        <signature>
            <person>Zap Branigan</person>
            <title>Director of corporate stuffs</title>
        </signature>
    </body>
</document>

1 ответ

На случай, если кому-то интересно, вот к чему я пришел. Кстати, исходной базой данных является Lotus Domino. Чтобы упростить вещи, я быстро разработал очень простую базу, имеющую дело с "вещами", которые имеют форму, цвет и размер. Три поля, это начало.

Я использовал LibreOffice. Он имеет встроенную опцию сохранения и чтения документов в виде плоского XML (.fodt), чего нет в OpenOffice. Для дизайна и преобразования, старый добрый Notepad++ с надстройкой "XML Tools".

1 / Только что экспортированный XML

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="shapeshifter.xsl"?>
<document xmlns="http://www.lotus.com/dxl" version="9.0" maintenanceversion="1.0" replicaid="C125801D0049FEC5" form="Thingy">
    <noteinfo noteid="8f6" unid="25031389A7D0B3E4C125801D004B9E77" sequence="8">
        <created>
            <datetime dst="true">20160828T154557,67+02</datetime>
        </created>
        <modified>
            <datetime dst="true">20160828T160525,82+02</datetime>
        </modified>
        <revised>
            <datetime dst="true">20160828T160525,81+02</datetime>
        </revised>
        <lastaccessed>
            <datetime dst="true">20160828T160525,82+02</datetime>
        </lastaccessed>
        <addedtofile>
            <datetime dst="true">20160828T154610,89+02</datetime>
        </addedtofile>
    </noteinfo>
    <updatedby>
        <name>CN=&#xC9;ric/O=Org</name>
    </updatedby>
    <revisions>
        <datetime dst="true">20160828T154610,88+02</datetime>
        <datetime dst="true">20160828T154724,42+02</datetime>
        <datetime dst="true">20160828T154926,61+02</datetime>
        <datetime dst="true">20160828T155209,03+02</datetime>
        <datetime dst="true">20160828T155257,07+02</datetime>
        <datetime dst="true">20160828T155950,07+02</datetime>
        <datetime dst="true">20160828T160018,99+02</datetime>
    </revisions>
    <item name="$EncryptionStatus">
        <text>0</text>
    </item>
    <item name="$SignatureStatus">
        <text>0</text>
    </item>
    <item name="Shape">
        <text>oval</text>
    </item>
    <item name="Color">
        <text>red</text>
    </item>
    <item name="Size">
        <text>medium</text>
    </item>
</document>

2/ XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:d="http://www.lotus.com/dxl"
        xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
        xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
        >
    <xsl:output method="xml" encoding="utf-8" version="1.0" media-type="application/xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates select="d:document"/>
    </xsl:template>

    <xsl:template match="d:document">

        <office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
            xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
            office:version="1.2"
            office:mimetype="application/vnd.oasis.opendocument.text">
            <office:body>
                <office:text>
                    <text:sequence-decls>
                        <text:sequence-decl text:display-outline-level="0"
                                text:name="Illustration"/>
                        <text:sequence-decl text:display-outline-level="0"
                                text:name="Table"/>
                        <text:sequence-decl text:display-outline-level="0"
                                text:name="Text"/>
                        <text:sequence-decl text:display-outline-level="0"
                                text:name="Drawing"/>
                    </text:sequence-decls>
                    <text:p text:style-name="P1">
                        <xsl:text>We see here an object whose color is </xsl:text>
                        <xsl:apply-templates select="d:item[@name='Color']"/>
                        <xsl:text> and in the shape of a </xsl:text>
                        <xsl:apply-templates select="d:item[@name='Shape']"/>
                        <xsl:text>. Note the </xsl:text>
                        <xsl:apply-templates select="d:item[@name='Size']"/>
                        <xsl:text> size.</xsl:text>     
                    </text:p>
                </office:text>
            </office:body>
        </office:document>          

    </xsl:template>

    <xsl:template match="*">
        <xsl:text>A thing.&#10;</xsl:text>
    </xsl:template>
    <xsl:template match="d:item[@name='Color']">
        <xsl:value-of select="d:text"/>
    </xsl:template>
    <xsl:template match="d:item[@name='Shape']">
        <xsl:value-of select="d:text"/>
    </xsl:template>
    <xsl:template match="d:item[@name='Size']">
        <xsl:value-of select="d:text"/>
    </xsl:template>
</xsl:stylesheet>

3 / Выход

<?xml version="1.0" encoding="utf-8"?>
<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:d="http://www.lotus.com/dxl" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
  <office:body>
    <office:text>
      <text:sequence-decls>
        <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
        <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
        <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
        <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
      </text:sequence-decls>
      <text:p text:style-name="P1">We see here an object whose color is red and in the shape of a oval. Note the medium size.</text:p>
    </office:text>
  </office:body>
</office:document>

Результат можно сохранить как something.fodt и напрямую открывается с помощью LibreOffice.

Следующие шаги:

  • автоматизировать процесс так, чтобы, с точки зрения пользователя, все происходило сразу по нажатию кнопки.

  • больше работы над шаблоном xsl. Реальный документ Domino намного сложнее, с несколькими уровнями вложенности и множеством типов элементов.

  • и, конечно же, весь смысл в том, чтобы сгенерировать красиво оформленный документ, чтобы больше разбираться в тонкостях DTD Oasis...

Но, по крайней мере, теперь у меня есть подтверждение концепции и описание метода.

Другие вопросы по тегам