Написание 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=É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. </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...
Но, по крайней мере, теперь у меня есть подтверждение концепции и описание метода.