2010-05-27 53 views
2

我正在研究一個相當大的DocBook XML文檔。主要書籍有章節,但包括所有小節通過引用使用實體。事情是這樣的:ENTITY聲明是否可以嵌套在引用的XML文件中?

main.book.xml

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" 
[ 
<!ENTITY section1 SYSTEM "../fragments/section1.xml"> 
<!ENTITY section2 SYSTEM "../fragments/section2.xml"> 
<!ENTITY section3 SYSTEM "../fragments/section3.xml"> 
<!ENTITY section3_a SYSTEM "../fragments/section3_a.xml"> 
<!ENTITY section3_b SYSTEM "../fragments/section3_b.xml"> 
<!ENTITY section3_c SYSTEM "../fragments/section3_c.xml"> 
]> 

<book> 
    <chapter> 
     <title>Chapter 1</title> 
     &section1; 
     &section2; 
     &section3; 
    </chapter> 
</book> 

第3節又分爲多個XML文件,其內容以供參考,像這樣:

section3.xml

<?xml version="1.0" encoding="UTF-8"?> 
<section id="Section3"> 
    <title>Section 3</title> 
    &section3_a; 
    &section3_b; 
    &section3_c; 
</section> 

問題:是否有辦法將僅由第3節使用的ENTITY聲明(即section3_a,section3_b等)移動到section3.xml而不是在main.book.xml中宣佈他們?

回答

3

是的,這是可能的,只是將它們添加到文檔中,您正在使用它們。 但我強烈建議不要使用實體,以包含其他文檔(零件)!不久或將來,您將遇到困難,文件(零件)中的一個(或多個)不可用。你的文件不會渲染和搜索導致它很討厭的問題。更好的解決方案是使用XInclude來包含文檔。

解決方案與實體條目

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" 
    "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" 
[ 
    <!ENTITY section1 SYSTEM "../fragments/section1.xml"> 
    <!ENTITY section2 SYSTEM "../fragments/section2.xml"> 
    <!ENTITY section3 SYSTEM "../fragments/section3.xml"> 
]> 

<book> 
    <chapter> 
     <title>Chapter 1</title> 
     &section1; 
     &section2; 
     &section3; 
    </chapter> 
</book> 

與其他文檔文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" 
    "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" 
[ 
    <!ENTITY section3_a SYSTEM "../fragments/section3_a.xml"> 
    <!ENTITY section3_b SYSTEM "../fragments/section3_b.xml"> 
    <!ENTITY section3_c SYSTEM "../fragments/section3_c.xml"> 
]> 
<section id="Section3"> 
    <title>Section 3</title> 
    &section3_a; 
    &section3_b; 
    &section3_c; 
</section> 

提示:你甚至可以將實體一起出你的文件,一看便知我在這個問題上寫了DocBook macros?

帶XInclude的解決方案

這裏是一個如何使用XInclude設置文檔的示例。實體條目用於小字符串。並使用XInclude進行文件包含。

<?xml version='1.0' encoding='UTF-8'?> 

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" 
    "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [ 
    <!ENTITY maven.project.version "(not set)"> 
    <!ENTITY % entities SYSTEM "entities.ent" > 

    %entities; 

]> 

<book> 
    <title>&product.name;</title> 
    <subtitle>Release Notes</subtitle> 
    <bookinfo> 
     <date>&product.release.date;</date> 
     <releaseinfo><?eval ${project.version}?></releaseinfo> 
    </bookinfo> 

    <!-- Include chapters --> 
    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="changes/chapter-release-2.0.xml" /> 
    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="changes/chapter-release-2.1.xml" /> 
</book> 

一個章節文件(放在目錄changes),因爲它是由以前的文檔包括在內。如果如上所述使用xi:include,則將停止呈現,如果href屬性無法解決。

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" 
    "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"[ 
    <!ENTITY section-changes  "section-changes-v2.0.xml"> 
    <!ENTITY % entities  SYSTEM "../entities.ent"> 

    %entities; 

]> 

<chapter id="release-2.0"> 
    <title>Release 2.0</title> 
    <para> 
     Information given in this chapter applies for <emphasis>&product.name; v2.0</emphasis>. 
    </para> 

    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="&section-changes;"> 
     <xi:fallback><para>FIXME File not found: "&section-changes;"</para></xi:fallback> 
    </xi:include> 

</chapter> 

這裏xi:include是使用回退,所以如果xi:includehref屬性不能被解決,回退渲染到文件(這將顯示出它與FIXME一個段落。這裏實際使用一個實體,引用文檔(位置)。這是偉大的,因爲可參照隨後在href和FIXME部分使用!

小心參考回到實體文件../entities.ent這又何時能給予嚴重錯誤無法解析。

+0

太棒了!使用XInclude是一個更好的解決方案。這樣每個片段將自成一體。將實體分解爲「entities.ent」也應該提高可維護性。謝謝! – 2010-06-07 15:40:36

+0

實體本身的位置是否可以包含在實體中? – Vadi 2013-07-17 22:17:00

+0

@Vadi是的,這是可能的(在以前的項目中做過)。 – Verhagen 2013-08-21 11:40:48