Могут ли объявления ENTITY быть вложенными в ссылочные XML-файлы? - PullRequest
2 голосов
/ 27 мая 2010

Я работаю над довольно большим документом DocBook XML. Главная книга имеет главы, но включает в себя все подразделы по ссылкам с использованием сущностей. Примерно так:

main.book.xml * * 1004

<!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>

ВОПРОС: Есть ли способ переместить объявления ENTITY, используемые только Разделом 3 (то есть section3_a, section3_b и т. Д.), В section3.xml вместо их объявления в main.book.xml?

1 Ответ

3 голосов
/ 05 июня 2010

Да, это возможно, просто добавьте их в документ, вы их используете.Но я настоятельно не рекомендую использовать юридические лица для включения других документов (частей)!Как только рано или поздно вы столкнетесь с трудностями, один или несколько документов (частей) будут недоступны.Ваш документ не будет отображаться, и поиск проблемы вызывает его довольно неприятно.Гораздо лучшим решением является использование XInclude для включения документов.

Решение с записями ENTITY

<?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?

Решение с 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 используется с отступлением, поэтому, если href атрибут xi:include не может быть решен, запасной вариант отображается в документе (Это покажет абзац с FIXME в нем. Здесь используется фактически сущность для ссылки на документ (местоположение). Это здорово, что эта ссылказатем может использоваться в разделах href и FIXME!

Будьте осторожны при обращении к файлу сущностей ../entities.ent Это снова может привести к неприятным ошибкам, когда их невозможно устранить.

...