2012-01-10 68 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> 

處理

生成文件包含配方從產生和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?

蟒蛇預處理腳本

  • 優點:可能是最簡單的解決方案來實現這一目標?
  • 缺點:無法與XML自身機制

以外的東西來實現這一目標?

關於我應該採取哪種方式以及爲什麼歡迎的任何輸入。以及全碼的例子等

+0

是「xml文件」輸入到進程和「docbook文件」所需的輸出?什麼是「目標文件」?什麼是「基於標記的語法?請澄清 – mzjn 2012-01-10 18:19:30

+0

@mzjn」docbook文件「和」xml文件「是」源文件「文件,在處理完槽工具鏈(xsltproc和xsltproc)後應產生」目標文檔「工具鏈可以在實際的docbook工具之前包含預處理(或者在需要之後)。目標文檔應該具有上述替換。通過基於標籤的語法,我的意思是類似於「 ADJ SUPL「這是正確的XML。對不起,我不清楚。 – ojs 2012-01-11 00:36:29

回答

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> 

該文件(姑且稱之爲publication.docbook),那麼你可以變成一個PDF(出版。 pdf)。

我認爲這是你正在尋找的東西。我對嗎?

+0

是的,這是我一直在尋找。我希望有一些方法來實現這個合理優雅。謝謝。 – ojs 2012-01-13 22:49:03