XSL-FO: Можно ли использовать fo:marker для хранения чего-либо?

Этот вопрос является частью XSL-FO, частью XSLT и частью DITA. В общем, этот вопрос является попыткой выяснить, что я делаю неправильно с fo:marker, и понять, возможно ли то, что я пытаюсь сделать.

Я пытаюсь использовать fo:marker для хранения текста из определенного элемента, а затем извлекать этот текст в заголовке, как и следовало ожидать. Я делаю это как часть пользовательской таблицы стилей, которая является частью плагина DITA. Идея в том, что плагин предназначен для документа, в котором перечислены шаги для процедур. Шаги к этим процедурам обычно включают в себя кучу картинок. Таким образом, требование состоит в том, что когда шаг пересекает страницу, первое предложение шага действует как своего рода бегущий заголовок. В DITA первое предложение шага фиксируется в элементе cmd. Итак, я подумал, что могу настроить шаблон, который обрабатывает cmd элементов с fo:marker.

Вот как выглядит шаблон для cmd с добавленным маркером:

<xsl:template match="*[contains(@class, ' task/cmd ')]" priority="1">
    <fo:block xsl:use-attribute-sets="cmd">                     
        <xsl:call-template name="commonattributes"/>             
        <xsl:if test="../@importance='optional'">
            <xsl:call-template name="insertVariable">
                <xsl:with-param name="theVariableID" select="'Optional Step'"/>
            </xsl:call-template>
            <xsl:text> </xsl:text>
        </xsl:if>
        <fo:inline>
            <fo:marker marker-class-name="current-step"/>
        </fo:inline>
        <xsl:apply-templates/>            
    </fo:block>
</xsl:template>

Это не работает. Я немного поиграл с этим и смог заставить это работать только с элементами info, которые являются родственными для cmd, когда я изменил шаблон следующим образом:

<xsl:template match="*[contains(@class, ' task/info ')]">
    <fo:block xsl:use-attribute-sets="info">    
        <fo:inline>
            <fo:marker marker-class-name="current-step">
                <xsl:apply-templates/>
            </fo:marker>
        </fo:inline>
        <xsl:call-template name="commonattributes"/>            
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>

Дело в том, что я попробовал эту конструкцию с элементом cmd (т.е. включить инструкцию apply-templates) и все равно ничего не выдает.

Возможно ли то, что я описал, и почему мой маркер работает только тогда, когда я включаю инструкцию применения шаблонов и только для элемента info?


person Jason Davis    schedule 04.12.2015    source источник


Ответы (1)


Вам нужно что-то внутри fo:marker, потому что это содержимое fo:marker, которое "может быть извлечено и отформатировано из fo:static-content... с помощью fo:retrieve-marker". См. http://www.w3.org/TR/xsl11/#fo_marker.

Я не знаю, почему fo:marker с содержимым и с одним и тем же именем класса маркера не работает в обоих контекстах. Вы используете retrieve-position="first-including-carryover" на fo:retrieve-marker? Вы оставили fo:marker вместо info так, чтобы он маскировал fo:marker вместо cmd?

Совершенно отдельной альтернативой может быть размещение каждого шага в таблице с одним столбцом без границ и размещение содержимого cmd в заголовке таблицы.

person Tony Graham    schedule 04.12.2015
comment
Спасибо за отзыв @tony. На самом деле я сначала пробовал это как заголовок таблицы, но это усложняло то, что я уже использую таблицы в том, как строятся сами шаги. Одно из других требований заключается в том, что изображения для шага должны существовать рядом с соответствующей инструкцией. Я полагал, что использование маркеров позволит добиться того, чего я хочу, не слишком ставя под угрозу структуру шагов. В целом, можете ли вы сказать, что использование заголовка или маркера — единственный реальный способ выполнить то, что я пытаюсь сделать? - person Jason Davis; 05.12.2015
comment
Вы можете поместить fo:table внутрь fo:table-cell, но поскольку вы уже используете таблицы, вы, вероятно, можете комбинировать маркеры и таблицы и использовать `fo:retrieve-table-marker (w3.org/TR/xsl11/#fo_retrieve-table-marker), чтобы получить набор маркеров в текущей таблице. - person Tony Graham; 05.12.2015
comment
Спасибо Тони. Основываясь на ваших отзывах, я смог выяснить, почему я неправильно использовал fo:marker. - person Jason Davis; 07.12.2015