编写XSLT以从某个数据库合成OpenOffice文档

时间:2016-08-25 05:29:04

标签: xml xslt lotus-domino openoffice-writer

所以我有这个传统的专有数据库,它可以发出一些结构良好的XML。

我想从某些记录中获取XSLT以获取OpenOffice文档,以便取悦秘书,由大老板签名并作为官方公司蜗牛邮件发送。具有法律约束力的确如此更好。生成的文档非常简单,您的平均商业信函可能有一两个表,最多两页。不要问我为什么他们仍然使用蜗牛邮件。

我看到OpenOffice文档当然也是XML。 (MS Office也许,这是一个选择,但我现在会坚持OO)。

几年前,我对XSLT的体验远远超过基本教程。

我在网上搜索OOo DTD时非常敏捷,而且比我想象的还要难以捉摸。

我很欣赏一些让我入门的建议。

1 /那些该死的OpenOffice DTD在哪里?

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 个答案:

答案 0 :(得分:1)

如果有人有兴趣,这是我到目前为止所做的。顺便说一句,源数据库是Lotus Domino。为了简化事情,我迅速设计了一个非常简单的基础来处理&#34;事情&#34;有形状,颜色和大小。三个领域,它是一个开始。

我使用了LibreOffice。它具有保存和读取文档作为平面XML(.fodt)的本机选项,OpenOffice没有。 对于设计和转换,旧的Notepad ++使用&#34; XML工具&#34;插件。

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文档比这更复杂,具有多层嵌套和更多元素类型。

  • 当然,重点是生成一个结构合理的文档,这样就可以更好地挖掘Oasis DTD的细节......

但至少现在我有概念证明和方法概要。