2012-01-10 8 views
1

質問

xmlファイルからdocbookテーブルを作成する方法を検討しています。目標は、必要なデータへの最小限の参照を含むdocbookファイルを持つことです。 docbookファイルが最終的な出版に処理されるとき、この参照はxmlファイルから取り出されたデータに置き換えられるべきです。xmlファイルからdocbookテーブルにデータを入力

具体例

下記は、これをさらに具体的に説明するための具体例です。この質問をする私の最初の試みがあまりにも曖昧だったので、それはかなり詳細です。

ソースdocument.docbook

<?xml version="1.0" encoding="utf-8"?> 
<article xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="en"> 
    <info><title/></info> 
    <table><title/><tgroup cols="2"><tbody> 
     <row> 
      <entry>good in comparative</entry> 
      <entry> 
       <phrase role="populateme"> 
        <phrase>good</phrase> 
        <phrase>ADJ COMP</phrase> 
       </phrase> 
      </entry> 
     </row> 
     <row> 
      <entry>good in superlative</entry> 
      <entry> 
       <phrase role="populateme"> 
        <phrase>good</phrase> 
        <phrase>ADJ SUPL</phrase> 
       </phrase> 
      </entry> 
     </row> 
    </tbody></tgroup></table> 
</article> 

ソースdatabase.xml

<?xml version="1.0" encoding="utf-8"?> 
<database> 
    <row> 
     <cell>good</cell> 
     <cell>ADJ POST</cell> 
     <cell>good</cell> 
    </row> 
    <row> 
     <cell>better</cell> 
     <cell>ADJ COMP</cell> 
     <cell>good</cell> 
    </row> 
    <row> 
     <cell>best</cell> 
     <cell>ADJ SUPL</cell> 
     <cell>good</cell> 
    </row> 
</database> 

処理

Makefileはからpublication.pdfを生成するためのレシピを含んおよびsource-database.xml。 (現在の選択の私のツールは、xsltprocのとFOPですが、他の人が提案することができます)

publication.pdf

通常のDocBookは、次の置換でPDF出版を準備:

<phrase role="populateme"> 
    <phrase>good</phrase> 
    <phrase>ADJ COMP</phrase> 
</phrase> 

上記はbetterを生成しますgoodADJ COMPの代わりに

<phrase role="populateme"> 
    <phrase>good</phrase> 
    <phrase>ADJ SUPL</phrase> 
</phrase> 

上記bestの代わりgoodADJ SUPLを生成します。

最終発言

<phrase role="populateme"><phrase>ref</phrase><phrase>ref2</phrase></phrase> 

上記の「構文は、」私はまだそれが有効なのdocbookある任意のより良いとは思いませんでした、非常に面倒ですが。ソリューションに関する

予備的思考

XIncludeのタグ

  • 長所:XML技術
  • 短所:XPointerの悪いサポート、ソリューションは、おそらくすべてで可能ならば面倒なことであろう

xslt前処理変換

  • 長所:XML技術
  • 短所:XSLTはかなり混乱し、さらにこれは、XSLTを達成することは不可能かもしれないですか?

Pythonの前処理スクリプト

  • 長所:これを達成する可能性が最も簡単な解決策?
  • 短所:XMLの独自のメカニズムでこれを達成できないこと

他の何か?

私はこれをどのように受けなければならないのか、なぜ歓迎されたのかについてのご意見をお寄せください。同様に完全なコード例などここ

+0

「xmlファイル」はプロセスへの入力で、「docbookファイル」は目的の出力ですか? 「対象文書」とは何ですか? – mzjn

+0

@mzjn "docbook file"と "xml file"は、 "source"ファイルです。処理されたトラフのツールチェーン(xsltprocと)の後に "target document"(私の場合はpdfファイル)を生成する必要があります。 fop)は、makefileから呼び出されます。ツールチェインには、実際のドキュメントブックツールの前に(または後に)前処理が含まれていてもかまいません。 "これは適切なXMLです – ojs

答えて

2

は、XSLTスタイルシートである:

<?xml version='1.0'?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:db="http://docbook.org/ns/docbook" 
      exclude-result-prefixes="db" 
      version="1.0"> 

    <xsl:variable name="database" select="document('source-database.xml')"/> 

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

    <xsl:template match="db:entry[db:phrase[@role='populateme']]"> 

    <xsl:element name="entry" namespace="http://docbook.org/ns/docbook"> 
     <xsl:value-of select="$database//row[cell[3] = current()/db:phrase/db:phrase[1] 
          and cell[2] = current()/db:phrase/db:phrase[2]]/cell[1]"/> 
    </xsl:element> 

    </xsl:template> 
</xsl:stylesheet> 

スタイルシートはソースdatabase.xmlでルックアップを行います。それはソースdocument.docbookに適用されると、以下の結果文書が生成されます。

<article xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="en"> 
    <info><title/></info> 
    <table><title/> 
    <tgroup cols="2"> 
    <tbody> 

     <row> 
     <entry>good in comparative</entry> 
     <entry>better</entry> 
     </row> 

     <row> 
     <entry>good in superlative</entry> 
     <entry>best</entry> 
     </row> 

    </tbody> 
    </tgroup> 
    </table> 
</article> 

この文書は、あなたがしてPDF(出版物になることができます(のはpublication.docbookそれを呼びましょう)。 pdf)。

私はそれがあなたが探しているようなものだと思います。私は正しい?

+0

はい、これは私が探していたものですが、これを合理的にエレガントに達成する方法があることを期待していました。 – ojs

関連する問題