друг!
ЯндексЯндекс. ДеньгиХочу такую же кнопку

Объекты форматирования-5

 

Назад

Оглавление

В конец страницы

Вперёд

 

Краткое Содержание
6 Объекты Форматирования (ОФ)
    6.1 Введение
    6.2 Содержимое ОФ
    6.3 ОФ. Резюме.
    6.4 Объявление и Разбивка на Страницы и Структура ОФ
    6.5 ОФ уровня блока
    6.6 ОФ инлайн-уровня
    6.7 ОФ для Таблиц
    6.8 ОФ для Списков
    6.9 Динамические Эффекты: Объекты Форматирования Link и Multi
    6.10 Внестрочные/Out-of-Line ОФ
    6.11 Прочие ОФ

6.7.3 fo:table

Обычное Использование:

Объект потока fo:table используется для форматирования табличного материала таблицы. Объект потока fo:table flow и его дочерние объекты потока моделируют визуальную структуру таблицы в манере "row primary/первичность рядов?". Таблица в целом может рассматриваться как состоящая из решётки рядов и столбцов, где каждая ячейка занимает одну или более единиц решётки в направлениях row-progression-direction и column-progression-direction. Содержимое таблицы подразделяется на шапку (необязательный элемент), футер (необязательный элемент) и одно или более тел. Свойства определяют, повторяются ли шапки и футеры при разрыве таблицы. Каждая из этих частей занимает один или более рядов решётки таблицы.

Области:

ОФ fo:table генерирует и возвращает одну или более нормальных блок-областей. Кроме того, fo:table возвращает любые области page-level-out-of-line и reference-level-out-of-line, возвращаемые дочерними объектами объекта fo:table. Области, генерируемые и возвращаемые ОФ fo:table, имеют в качестве дочерних:

  • Области, с одним фоном, соответствующие шапке, футеру, телу таблицы, захваченным рядам, столбцам и рядам.

    ПРИМЕЧАНИЕ:

    Захватывающие столбцы (fo:table-column со значением "number-columns-spanned" больше 1) используются  тем же путём, что и "группы столбцов/column groups" в CSS2 при определении фона.

  • Области, возвращаемые объектами fo:table-cell.

Эти области имеют z-индеус, контролирующий порядок представления в соответствии со спецификацией раздела 17.5.1 в CSS2 (http://www.w3.org/TR/REC-CSS2/tables.html#table-layers").

ПРИМЕЧАНИЕ:

Захватывающая ячейка может иметь свой фон для каждой единицы решётки, занимаемой ею.

Получение Уточнения:

Области, генерируемые и возвращаемые ОФ  fo:table, имеют значение "true" для is-reference-area. Направления column-progression-direction и row-progression-direction определяются уточнением writing-mode/режим письма. Столбцы используют направление inline-progression-direction, а ряды - направление block-progression-direction. Метод получения уточнений рамки таблицы специфицируется свойством "border-collapse". Если свойство "border-collapse" имеет значение "separate", рамка составляется из двух компонентов. Первый, размещаемый с внутренним краем, прилегающим к линии внешней границы решётки таблицы, имеет ширину в половину значения свойства "border-separation". Он заполняется в соответствии со свойством "background" объекта fo:table. Второй, снаружи от линии внешней границы решётки таблицы, размещает, по каждой стороне таблицы, рамку на базе рамки, специфицированной для таблицы. Если свойство "border-collapse" имеет значение "collapse" или "collapse-with-precedence", рамка определяется для каждого сегмента на уровне ячейки.

ПРИМЕЧАНИЕ:

Специфицировав  "collapse-with-precedence" и подходящий высокий приоритет в спецификации рамки для fo:table, можно быть уверенным, что именно эта спецификация будет использоваться во всех сегментах рамки.

Ограничения:

Никакая область не может иметь более одной нормальной дочерней области, возвращаемой тем же самым ОФ fo:table. Размер inline-progression-dimension прямоугольника содержимого таблицы - это сумма направлений inline-progression-dimension столбцов решётки таблицы. Метод используемый для определения этих размеров inline-progression-dimension, управляется значениями уточнений table-layout и inline-progression-dimension следующим образом:

inline-progression-dimension="auto" table-layout="auto"

Будет использоваться автоматическое структурирование таблицы.

inline-progression-dimension="auto" table-layout="fixed"

Будет использоваться автоматическое структурирование таблицы.

inline-progression-dimension=<length> or <percentage> table-layout="auto"

Будет использоваться автоматическое структурирование таблицы.

inline-progression-dimension=<length> or <percentage> table-layout="fixed"

Будет использоваться фиксированное структурирование таблицы.

Автоматическое и фиксированное структурирование таблицы определено в разделе 17.5.2 спецификации CSS2 (http://www.w3.org/TR/REC-CSS2/tables.html#width-layout"). Метод определения размера block-progression-dimension таблицы управляется уточнением block-progression-dimension.

ПРИМЕЧАНИЕ:

Спецификация CSS2 явно не специфицирует нужное поведение в случае несоответствия между явно специфицированным размером block-progression-dimension таблицы и размерами block-progression-dimension содержимого.

ПРИМЕЧАНИЕ:

Если используется фиксированная структура таблицы, разрешается использовать только функцию "proportional-column-width()".

Если необходимо использовать пропорциональную ширину столбцов в таблице с неизвестной явно установленной шириной, то размер inline-progression-dimension не может специфицироваться как "auto". Вместо этого, ширина обязана быть специфицирована как процентное значение. Например, установки table-layout="fixed" и inline-progression-dimension="100%" дадут столбцы пропорциональной ширины, одновременно создавая таблицу, максимально широкую в данном контексте.

ПРИМЕЧАНИЕ:

Результат подобного использования процентных значений может быть непредсказуемым, особенно при использовании автоматического структурирования таблицы.

Если две ячейки таблицы перекрываются, это ошибка.

ПРИМЕЧАНИЕ:

Такое перекрывание может происходить по причине назначения одного номера столбца двум разным ячейкам одного ряда или из-за захвата рядов или столбцов, вызывающего перекрывание.

Содержимое:

(table-column*,table-header?,table-footer?,table-body+)

Этот ОФ дополнительно может содержать последовательность из нуль или более объектов fo:marker в качестве начальных дочерних объектов.

Следующие свойства применяются к данному ОФ:

6.7.4 fo:table-column

Обычное Использование:

Вспомогательный ОФ fo:table-column специфицирует характеристики, применяемые в ячейках таблицы, имеющих общий столбец и захват. Наиболее важным является свойство "column-width".

Области:

ОФ fo:table-column не генерирует и не возвращает областей. Он содержит набор уточнений, предоставляющих ограничения на ширину столбцов и спецификацию некоторых характеристик представления, таких как фон, которые влияют на области, генерируемые объектом fo:table (см. [6.7.3 fo:table]). Наследуемые свойства также могут быть специфицированы в fo:table-column. На них можно ссылаться в выражениях через функцию from-table-column().

Ограничения:

Отсутствуют.

Содержимое:

EMPTY

Следующие свойства применяются к данному ОФ:

6.7.5 fo:table-caption

Обычное Использование:

ОФ fo:table-caption используется как контейнер объектов форматирования, содержащих заголовок таблицы, только в том случае, если используется fo:table-and-caption.

Области:

ОФ fo:table-caption генерирует одну или более нормальных областей reference-area. fo:table-caption возвращает эти области reference-area и любые области page-level-out-of-line, возвращаемые дочерними объектами объекта fo:table-caption.

Получение Уточнения:

Области, генерируемые ОФ fo:table-caption, имеют для is-reference-area значение "true".

Ограничения:

Для случая, когда значение уточнения caption-side равно "before" или "after", размер inline-progression-dimension прямоугольника содержимого генерируемой области reference-area равен inline-progression-dimension прямоугольника содержимого области reference-area, которая содержит её в себе.

Если значение равно "start" или "end", размер inline-progression-dimension генерируемой области reference-area ограничивается значением уточнения inline-progression-dimension.

Если значение равно "top", "bottom", "left" или "right", это значение отображается тем же способом, что и для соответствующих свойств (см. [5.3 Вычисление Значений Соответствующих Свойств]), и свойство рассматривается тогда так, как если бы соответствующее значение было специфицировано.

Если заголовок позиционируется перед таблицей, области, генерируемые объектом fo:table-caption, будут размещены в дереве областей, хотя fo:table-caption и имеет свойство "keep-with-next" со значением "always".

Если заголовок позиционируется после таблицы, области, генерируемые объектом fo:table-caption, будут размещены в дереве областей, хотя fo:table-caption и имеет свойство "keep-with-previous" со значением "always".

Никакая область не может иметь более одной нормальной дочерней области, возвращаемой одним и тем же ОФ fo:table-caption. Потомки каждой нормальной области, возвращаемой объектом fo:table-caption, обязаны быть нормальными блок-областями, возвращаемыми дочерними объектами объекта fo:table-caption, обязаны быть правильно стэкированы и обязаны быть правильно упорядоченными. Любые области reference-level-out-of-line, возвращаемые потомками объекта fo:table-caption, обрабатываются так, как описано в разделе [6.10.2 fo:float].

Содержимое:

(%block;)+

Этот ОФ дополнительно может содержать последовательность из нуль или более объектов fo:marker в качестве начальных дочерних объектов.

Следующие свойства применяются к данному ОФ:

6.7.6 fo:table-header

Обычное Использование:

ОФ fo:table-header используется для вмещения содержимого шапки таблицы.

Области:

ОФ fo:table-header не генерирует никаких областей. ОФ fo:table-header возвращает последовательность областей, создаваемую путём соединения последовательностей областей, возвращаемых каждым потомком объекта fo:table-header.

Ограничения:

Порядок объединения последовательностей областей, возвращаемых потомками объекта fo:table-header, тот же, что и порядок расположения потомков под fo:table-header.

Содержимое:

(table-row+|table-cell+)

fo:table-header имеет fo:table-row (одного или более) в качестве потомков или, альтернативно, fo:table-cell (одного или более). В последнем случае ячейки группируются в ряды с использованием свойств starts-row и ends-row.

Этот ОФ дополнительно может содержать последовательность из нуль или более объектов fo:marker в качестве начальных дочерних объектов.

Следующие свойства применяются к данному ОФ:

ПРИМЕЧАНИЕ:

Из этого набора применяются только свойства фона. Если значение border-collapse равно "collapse" или "collapse-with-precedence" для таблицы, применяются также свойства рамки.

6.7.7 fo:table-footer

Обычное Использование:

ОФ fo:table-footer используется как контейнер для футера таблицы.

Области:

ОФ fo:table-footer не генерирует никаких областей. ОФ fo:table-footer возвращает последовательность областей, создаваемую путём соединения последовательностей областей, возвращаемых каждым потомком объекта fo:table-footer.

Ограничения:

Порядок объединения последовательностей областей, возвращаемых потомками объекта fo:table-footer, тот же, что и порядок расположения потомков под fo:table-footer.

Содержимое:

(table-row+|table-cell+)

fo:table-footer имеет fo:table-row (одного или более) в качестве потомков или, альтернативно, fo:table-cell (одного или более). В последнем случае ячейки группируются в ряды с использованием свойств starts-row и ends-row. Этот ОФ дополнительно может содержать последовательность из нуль или более объектов fo:marker в качестве начальных дочерних объектов.

Следующие свойства применяются к данному ОФ:

ПРИМЕЧАНИЕ:

Из этого набора применяются только свойства фона. Если значение border-collapse равно "collapse" или "collapse-with-precedence" для таблицы, применяются также свойства рамки.

6.7.8 fo:table-body

Обычное Использование:

ОФ fo:table-body используется как контейнер тела таблицы.

Области:

ОФ fo:table-body не генерирует никаких областей. ОФ fo:table-body возвращает последовательность областей, создаваемую путём соединения последовательностей областей, возвращаемых каждым потомком объекта fo:table-body.

Ограничения:

Порядок объединения последовательностей областей, возвращаемых потомками объекта fo:table-body, тот же, что и порядок расположения потомков под fo:table-body.

Содержимое:

(table-row+|table-cell+)

fo:table-body имеет fo:table-row (одного или более) в качестве потомков или, альтернативно, fo:table-cell одного или более). В последнем случае ячейки группируются в ряды с использованием свойств starts-row и ends-row. Этот ОФ дополнительно может содержать последовательность из нуль или более объектов fo:marker в качестве начальных дочерних объектов.

Следующие свойства применяются к данному ОФ:

ПРИМЕЧАНИЕ:

Из этого набора применяются только свойства фона. Если значение border-collapse равно "collapse" или "collapse-with-precedence" для таблицы, применяются также свойства рамки.

6.7.9 fo:table-row

Обычное Использование:

ОФ fo:table-row используется для группирования ячеек таблицы в ряды: все ячейки ряда таблицы начинаются в одном геометрическом ряду решётки таблицы.

Области:

ОФ fo:table-row не генерирует никаких областей. ОФ fo:table-row возвращает последовательность областей, создаваемую путём соединения последовательностей областей, возвращаемых каждым потомком объекта fo:table-row. fo:table-row содержит спецификацию некоторых презентационных характеристик, таких как фон, которые влияют на области, генерируемые fo:table (см. [6.7.3 fo:table]).

Ограничения:

Порядок объединения последовательностей областей, возвращаемых потомками объекта fo:table-row, тот же, что и порядок расположения потомков под fo:table-row. Метод определения высоты ряда решётки управляется уточнением row-height.

Содержимое:

(table-cell+)

Следующие свойства применяются к данному ОФ:

ПРИМЕЧАНИЕ:

Из этого набора применяются только свойства фона. Если значение border-collapse равно "collapse" или "collapse-with-precedence" для таблицы, применяются также свойства рамки.

6.7.10 fo:table-cell

Обычное Использование:

ОФ fo:table-cell используется для группирования ячейки таблицы. Свойства "starts-row" и "ends-row" могут использоваться, если вводимые данные не содержат элементов, содержащих ячейки в каждом ряду, а, вместо этого, например, каждый ряд начинается с элементов определённого типа.

Области:

ОФ fo:table-cell генерирует одну или более нормальных областей reference-area. fo:table-cell возвращает эти области reference-area и любые области page-level-out-of-line, возвращаемые потомками fo:table-cell.

Получение Уточнения:

Области, генерируемые ОФ fo:table-cell, имеют для is-reference-area уточнение "true". Метод получения рамки ячейки специфицируется уточнением border-collapse.

Если уточнение border-collapse имеет значение "separate", рамка составляется из двух компонентов. Первый, прилегающий своим внешним краем к линии границы решётки таблицы, имеет ширину в половину значения уточнения border-separation. Он заполняется в соответствии с уточнением background объекта fo:table. Внутри него рамка размещается, по каждой стороне ячейки, как рамка на базе специфицированной рамки ячейки или наследуется.

Если уточнение border-collapse имеет значение "collapse-with-precedence", рамка для каждой стороны ячейки определяется выбором, для каждого сегмента рамки, из всех спецификаций рамки для данного сегмента рамки с наивысшим приоритетом. Будет считаться ошибкой, если имеются две рамки с одинаковым приоритетом, но не идентичные. Каждый сегмент рамки размещается центрированно по граничной линии решётки таблицы. Для устройств, не поддерживающих субпикселное отображение, если эффективная ширина рамки определяется как нечётное количество пикселов, реализацией будет определяться, на какой стороне граничной линии решётки будет размещаться это нечётное количество пикселов.

Если уточнение border-collapse имеет значение "collapse", рамка на каждой стороне ячейки определяется выбором, для каждого сегмента рамки, из всех спецификаций рамки для данного сегмента, рамки, имеющей самый "привлекательный" стиль рамки, см. ниже детали. Каждый сегмент рамки размещается центрированно по граничной линии решётки таблицы. Для устройств, не поддерживающих субпикселное отображение, если эффективная ширина рамки определяется как нечётное количество пикселов, реализацией будет определяться, на какой стороне граничной линии решётки будет размещаться это нечётное количество пикселов.
Если имеется конфликт между стилями сжимающихся сегментов рамки, следующие правила определяют, какой стиль рамки "побеждает":

  1. Рамки со значением 'border-style', равным 'hidden', имеют приоритет над всеми другими конфликтующими рамками. Любые рамки с таким значением подавляют все рамки в данном месте.

  2. Рамки со стилем 'none' имеют низший приоритет. Только в том случае, когда свойства рамок всех элементов, встречающихся у этого края, равны 'none', рамка будет отсутствовать (но имейте в виду, что 'none' - это значение по умолчанию для стиля рамки.)

  3. Если ни один из стилей не скрыт/'hidden' и не менее одного из них - не 'none', тогда более узкие рамки отбрасываются в пользу более широких.

  4. Если стили оставшихся рамок имеют одну 'border-width', эти стили имеют предпочтение в таком порядке: 'double', 'solid', 'dashed', 'dotted', 'ridge', 'outset', 'groove' и - самый низкий - 'inset'.

  5. Если стили рамок различаются только цветом, тогда набор стилей ячейки берёт верх над набором ряда, который берёт верх над набором группы рядов, столбцов, групп столбцов и, наконец, таблицы.

Ограничения:

Ячейка таблицы занимает одну или более единиц решётки в направлениях row-progression-direction и column-progression-direction. Прямоугольник содержимого ячейки имеет размер части решётки, занимаемой ячейкой, минус, для каждой из 4 сторон:

  • Если уточнение border-collapse имеет значение "separate": половина уточнения border-separation; иначе - 0.

  • Если уточнение border-collapse имеет значение  "separate": толщина рамки ячейки; иначе - половина толщины действующей рамки.

  • Заполнение ячейки.

Метод определения размера block-progression-dimension ячейки в решётке управляется уточнением row-height. Никакая область не может иметь более одной нормальной области-потомка, генерируемой одним и тем же ОФ fo:table-cell. Потомки каждой нормальной области, возвращаемой ОФ fo:table-cell, обязаны быть нормальными блок-областями, возвращаемыми потомками fo:table-cell, обязаны правильно стэкироваться и правильно упорядочиваться. Любые области reference-level-out-of-line, возвращаемые потомками объекта fo:table-cell, обрабатываются так, как описано в разделе [6.10.2 fo:float].

Содержимое:

(%block;)+

Этот ОФ дополнительно может содержать последовательность из нуль или более объектов fo:marker в качестве начальных дочерних объектов.

Следующие свойства применяются к данному ОФ:

6.8 Объекты Форматирования для Списков

6.8.1 Введение

Имеется 4 ОФ, используемых для построения списков: fo:list-block, fo:list-item, fo:list-item-label и fo:list-item-body.

Древовидное представление ОФ для Списков.

ОФ fo:list-block играет роль контейнера полного списка и спецификатора значений, используемых для геометрии списков в направлении inline-progression-direction (см. ниже детали). Потомки fo:list-block  - это один или более fo:list-item, каждый из которых содержит пару fo:list-item-label и fo:list-item-body.

fo:list-item играет роль контейнера каждого элемента списка.

fo:list-item-label играет роль контейнера содержимого, ОФ блок-уровня, для лэйбла list-item: обычно это fo:block, содержащий число, символ или букву.

fo:list-item-body играет роль контейнера содержимого, ОФ блок-уровня, для тела list-item: обычно это один или более fo:block.

Размещение, в направлении block-progression-direction, лэйбла, с учётом тела, выполняется в соответствии со свойством "vertical-align" объекта fo:list-item.

Спецификация геометрии списка в направлении inline-progression-direction достигается путём:

  • Специфицирования подходящих значений для свойств "provisional-distance-between-starts" и "provisional-label-separation". Свойство "provisional-distance-between-starts" специфицирует желаемое расстояние между начальными отступами/start-indents лэйбла и телом элемента списка. Свойство "provisional-label-separation" специфицирует желаемое расстояние между конечным отступом/end-indent лэйбла и начальным отступом/start-indent тела элемента списка.

  • Спецификации end-indent="label-end()" для объекта fo:list-item-label.

  • Спецификации start-indent="body-start()" для объекта fo:list-item-body.

            ПРИМЕЧАНИЕ:

Функции, специфичные для списков, определены в разделах [7.28.3 "provisional-label-separation"] и [7.28.4 "provisional-distance-between-starts"].

Start-indent элемента list-item-label и end-indent элемента list-item-body, если необходимо, специфицируются обычно как длина.

6.8.1.1 примеры

6.8.1.1.1 Нумерованный список

Все элементы списка содержатся в элементе "ol". Каждый элемент списка содержится в элементе "item" и содержит текст (в отличие от параграфов). Стиль состоит в нумеровании элементов списка в алфавитном порядке с точкой после буквы. Код:

<ol>
<item>List item 1.</item>
<item>List item 2.</item>
<item>List item 3.</item>
</ol>

Таблица стилей XSL:

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                version='1.0'>

<xsl:template match="ol">
  <fo:list-block provisional-distance-between-starts="15mm"
   provisional-label-separation="5mm">
    <xsl:apply-templates/>
  </fo:list-block>
</xsl:template>

<xsl:template match="ol/item">
  <fo:list-item>
    <fo:list-item-label start-indent="5mm" end-indent="label-end()">
      <fo:block>
        <xsl:number format="a."/>
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>
        <xsl:apply-templates/>
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
</xsl:template>

</xsl:stylesheet>

Результирующий Экземпляр: элементы и атрибуты в пространстве имён fo:

<fo:list-block provisional-distance-between-starts="15mm"
  provisional-label-separation="5mm">

  <fo:list-item>
    <fo:list-item-label start-indent="5mm" end-indent="label-end()">
      <fo:block>a.
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>List item 1.
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>

  <fo:list-item>
    <fo:list-item-label start-indent="5mm" end-indent="label-end()">
      <fo:block>b.
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>List item 2.
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>

  <fo:list-item>
    <fo:list-item-label start-indent="5mm" end-indent="label-end()">
      <fo:block>c.
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>List item 3.
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>

</fo:list-block>

6.8.1.1.2 Списки "dl" в стиле HTML

В этом примере таблица стилей обрабатывает списки "dl" в стиле HTML, содержащие чередующиеся пары элементов "dt" и "dd", трансформируя их в fo:list-block'и. Сбалансированные (полные) пары "dt"/"dd"s конвертируются в элементы fo:list-item. Для несбалансированных "dt"/"dd" таблица стилей принимает следующее:

  • Несколько "dt" группируются в один fo:list-item-label в одном элементе списка.

  • Несколько DD:

    • Выводятся как отдельные ОФ list-item с пустым list-item-label, если переменная $allow-naked-dd таблицы стилей равна true.

    • Группируются в отдельный ОФ list-item-body, если $allow-naked-dd равно false.

Другими словами, структура:

<doc>
<dl>
  <dt>term</dt>
  <dd>definition</dd>
  <dt>term</dt>
  <dt>term</dt>
  <dd>definition</dd>
  <dt>term</dt>
  <dd>definition</dd>
  <dd>definition</dd>
</dl>
</doc>

Если $allow-naked-dd  равно true, в результате даёт экземпляр: элементы и атрибуты в пространстве имён fo:

<fo:list-block provisional-distance-between-starts="35mm"
  provisional-label-separation="5mm">
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>term
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>definition
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>term
      </fo:block>
      <fo:block>term
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>definition
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>term
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>definition
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>definition
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
</fo:list-block>

Если $allow-naked-dd равно false, в результате даёт экземпляр: элементы и атрибуты в пространстве имён fo

<fo:list-block provisional-distance-between-starts="35mm"
  provisional-label-separation="5mm">
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>term
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>definition
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>term
      </fo:block>
      <fo:block>term
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>definition
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>term
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>definition
      </fo:block>
      <fo:block>definition
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
</fo:list-block>

Таблица стилей XSL:

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                version='1.0'>

<xsl:include href="dtdd.xsl"/>

<xsl:template match="doc">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="dl">
  <xsl:call-template name="process.dl"/>
</xsl:template>

<xsl:template match="dt|dd">
  <fo:block>
    <xsl:apply-templates/>
  </fo:block>
</xsl:template>

</xsl:stylesheet>

Подключает таблицу стилей "dtdd.xsl"

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                version='1.0'>

<xsl:variable name="allow-naked-dd" select="true()"/>

<xsl:template name="process.dl">
  <fo:list-block provisional-distance-between-starts="35mm"
   provisional-label-separation="5mm">
    <xsl:choose>
      <xsl:when test="$allow-naked-dd">
        <xsl:call-template name="process.dl.content.with.naked.dd"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="process.dl.content"/>
      </xsl:otherwise>
    </xsl:choose>
  </fo:list-block>
</xsl:template>

<xsl:template name="process.dl.content.with.naked.dd">
  <xsl:param name="dts" select="./force-list-to-be-empty"/>
  <xsl:param name="nodes" select="*"/>

  <xsl:choose>
    <xsl:when test="count($nodes)=0">
      <!-- Вне узлов, выводятся любые рассматриваемые DT -->
      <xsl:if test="count($dts)>0">
        <fo:list-item>
          <fo:list-item-label end-indent="label-end()">
            <xsl:apply-templates select="$dts"/>
          </fo:list-item-label>
          <fo:list-item-body start-indent="body-start()"/>
        </fo:list-item>
      </xsl:if>
    </xsl:when>

    <xsl:when test="name($nodes[1])='dd'">
      <!-- Находим DD, выводим DT и DD -->
      <fo:list-item>
        <fo:list-item-label end-indent="label-end()">
          <xsl:apply-templates select="$dts"/>
        </fo:list-item-label>
        <fo:list-item-body start-indent="body-start()">
          <xsl:apply-templates select="$nodes[1]"/>
        </fo:list-item-body>
      </fo:list-item>
      <xsl:call-template name="process.dl.content.with.naked.dd">
        <xsl:with-param name="nodes" select="$nodes[position()>1]"/>
      </xsl:call-template>
    </xsl:when>

    <xsl:when test="name($nodes[1])='dt'">
      <!-- Если находим DT, добавляем его к списку DT повторяем цикл -->
      <xsl:call-template name="process.dl.content.with.naked.dd">
        <xsl:with-param name="dts" select="$dts|$nodes[1]"/>
        <xsl:with-param name="nodes" select="$nodes[position()>1]"/>
      </xsl:call-template>
    </xsl:when>

    <xsl:otherwise>
      <!-- Это не должно произойти -->
      <xsl:message>
        <xsl:text>DT/DD list contained something bogus (</xsl:text>
        <xsl:value-of select="name($nodes[1])"/>
        <xsl:text>).</xsl:text>
      </xsl:message>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="process.dl.content">
  <xsl:param name="dts" select="./force-list-to-be-empty"/>
  <xsl:param name="dds" select="./force-list-to-be-empty"/>
  <xsl:param name="output-on"></xsl:param>
  <xsl:param name="nodes" select="*"/>

  <!-- Этот алгоритм выстраивает список из DT и DD, -->
  <!-- выводя их только переносом из DD обратно в DT -->

  <xsl:choose>
    <xsl:when test="count($nodes)=0">
      <!-- Вне узлов, выводим любые рассматриваемые элементы -->
      <xsl:if test="count($dts)>0 or count($dds)>0">
        <fo:list-item>
          <fo:list-item-label end-indent="label-end()">
            <xsl:apply-templates select="$dts"/>
          </fo:list-item-label>
          <fo:list-item-body start-indent="body-start()">
            <xsl:apply-templates select="$dds"/>
          </fo:list-item-body>
        </fo:list-item>
      </xsl:if>
    </xsl:when>

    <xsl:when test="name($nodes[1])=$output-on">
      <!-- Выполняем перенос из DD обратно в DT -->
      <fo:list-item>
        <fo:list-item-label end-indent="label-end()">
          <xsl:apply-templates select="$dts"/>
        </fo:list-item-label>
        <fo:list-item-body start-indent="body-start()">
          <xsl:apply-templates select="$dds"/>
        </fo:list-item-body>
      </fo:list-item>

      <!-- Этот узел перерабатывается (и остаток списка узла) -->
      <!-- восстанавливаем значение состояния output-on в nil -->
      <xsl:call-template name="process.dl.content">
        <xsl:with-param name="nodes" select="$nodes"/>
      </xsl:call-template>
    </xsl:when>

    <xsl:when test="name($nodes[1])='dt'">
      <!-- Находим DT, добавляем его к списку и повторяем цикл -->
      <xsl:call-template name="process.dl.content">
        <xsl:with-param name="dts" select="$dts|$nodes[1]"/>
        <xsl:with-param name="dds" select="$dds"/>
        <xsl:with-param name="nodes" select="$nodes[position()>1]"/>
      </xsl:call-template>
    </xsl:when>

    <xsl:when test="name($nodes[1])='dd'">
      <!-- Находим DD, добавляем его к списку и повторяем цикл, отмечая, что-->
      <!-- в следующий раз, когда мы возвращаемся к DT's, нам нужно вывести -->
      <!-- текущие DT/DDs. -->
      <xsl:call-template name="process.dl.content">
        <xsl:with-param name="dts" select="$dts"/>
        <xsl:with-param name="dds" select="$dds|$nodes[1]"/>
        <xsl:with-param name="output-on">dt</xsl:with-param>
        <xsl:with-param name="nodes" select="$nodes[position()>1]"/>
      </xsl:call-template>
    </xsl:when>

    <xsl:otherwise>
      <!-- Это не должно случиться -->
      <xsl:message>
        <xsl:text>DT/DD list contained something bogus (</xsl:text>
        <xsl:value-of select="name($nodes[1])"/>
        <xsl:text>).</xsl:text>
      </xsl:message>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>

Таблица стилей "dtdd.xsl" может изменить значения следующими способами:

  • Установить значение $allow-naked-dd для управления обработкой несбалансированных "dd"s.

  • Изменить "dt" на имя элемента, являющегося термином списка.

  • Изменить "dd" на имя элемента, являющегося в списке определением/definition.

  • В случае, достаточно маловероятном, когда документ может содержать элемент, именованный "force-list-to-be-empty", имя этого элемента должно быть изменено на имя, не используемое в документах.

В таблицах стилей, использующих таблицу стилей "dtdd.xsl", измените "dl" на имя элемента, который является оболочкой списка.


 

Назад

Оглавление

В начало страницы

Вперёд

 

Pyramidin.Narod.RU