XInclude в таблицах стилей XSLT (eXist-db)

Некоторые из моих таблиц стилей немного велики, а некоторые их части повторяются. Я хотел бы использовать для них XInclude, что позволило бы мне отделить их от всей таблицы стилей. Я не могу использовать здесь xsl:import или xsl:include, потому что мне нужно вставить их в определенное место для генерации закладок и активных ссылок (для XSL-FO).

Если я использую:

<xi:include href="/db/apps/tested-bunny/resources/xsl-fo/common/bookmark-tree.xml/>

… созданный файл .fo действительно включает эту часть. Однако часть не переведена, а значит, она есть в исходнике. Таким образом, процессор XSL-FO игнорирует его, и результат в формате pdf не содержит закладок.

Что касается отделенной части — я сохранил ее как обычный XML-файл с двумя пространствами имен, объявленными в корневом элементе:

<fo:bookmark-tree xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:if test="$head-level ge '1'">
    ...

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

Есть ли какая-то конкретная практика или ограничения, о которых я не знаю? Как это сделать правильно?


person Honza Hejzl    schedule 21.04.2016    source источник


Ответы (1)


Для меня рабочим решением было не XInclude, а xsl:include и вызов шаблона в нужное время:

...
</fo:declarations>
<!-- Bookmarks from the external stylesheet -->
<xsl:call-template name="bookmark-tree"/>
<fo:page-sequence master-reference="title-page">
...

Я создал правильную таблицу стилей. Важно было установить корневой элемент в текущий контекст:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="2.0">
    <xsl:template name="bookmark-tree" match=".">
        <fo:bookmark-tree>
            ...

Ну и конечно нужно было включить таблицу стилей в ту, где я вызываю шаблон:

<xsl:include href="common/bookmark-tree.xsl"/>

На данный момент я считаю этот вопрос ответом.

person Honza Hejzl    schedule 26.04.2016