Есть ли что-то вроде CSS, встроенного в XSL-FO?

Я знаю, что сам XSLT имеет наборы атрибутов, но это заставляет меня использовать

<xsl:element name="fo:something">

каждый раз, когда я хочу вывести

<fo:something>

ярлык. Есть ли в спецификации XSL-FO что-нибудь, что позволило бы мне указать (скажем) набор атрибутов по умолчанию (поле, заполнение и т. д.) для всех таблиц в выводе FO?

По сути, я ищу функциональность CSS, но для вывода FO вместо HTML.


person Jay Stevens    schedule 10.06.2009    source источник
comment
См. stackoverflow.com/a/21345708/287948 о замене старого XSL-FO более новыми элементами экосистемы веб-стандартов.   -  person Peter Krauss    schedule 12.09.2017


Ответы (2)


Нет, вы не обязаны использовать xsl:element, атрибут use-attribute-sets может появиться в литеральных элементах результатов, если вы поместите его в пространство имен XSLT, поэтому вы можете использовать что-то вроде:

<fo:something xsl:use-attribute-sets="myAttributeSet">

Если вы хотите иметь что-то близкое к функциональности CSS, вы можете добавить еще одно преобразование XSLT в конце обработки, которое добавляет нужные вам атрибуты. Вы можете начать с рекурсивного преобразования идентичности, а затем добавить шаблоны, соответствующие элементам, которые вы хотите изменить, см. небольшой пример ниже.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:attribute-set name="commonAttributes">
    <xsl:attribute name="common">value</xsl:attribute>
  </xsl:attribute-set>
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="someElement">
    <xsl:copy use-attribute-sets="commonAttributes">
      <xsl:attribute name="someAttribute">someValue</xsl:attribute>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
person George Bina    schedule 11.06.2009
comment
Не так заинтересован в рекурсивной идентификации в нижней части этого ответа, но простое добавление наборов xsl:use-attribute-sets прекрасно работает. На самом деле вы можете добавить несколько ссылок на наборы атрибутов, как в (use-attribute-sets=attributeSet1 attributeSet2), так что это, на самом деле, действует ОЧЕНЬ ПОХОЖЕ на CSS! Превосходно! - person Jay Stevens; 11.06.2009

В XSLT 2.0 есть еще один вариант. Следующий шаблон может быть в отдельном файле. Вам нужно только включить этот файл в исходный файл xsl, который генерирует структуру FO.

<xsl:transform 
    version="2.0"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/" priority="1000">
        <!-- Store generated xsl-fo document in variable-->
        <xsl:variable name="xsl-fo-document">
            <xsl:next-match/>
        </xsl:variable>

        <!-- Copy everything to result document and apply "css" -->
        <xsl:apply-templates select="$xsl-fo-document" mode="css"/>
    </xsl:template>

    <xsl:template match="@*|node()" priority="1000" mode="css">
        <xsl:param name="copy" select="true()" tunnel="yes"/>
        <xsl:if test="$copy">
            <xsl:copy>
                <xsl:next-match>
                    <xsl:with-param name="copy" select="false()" tunnel="yes"/>
                </xsl:next-match>
                <xsl:apply-templates select="@*|node()" mode="css"/>
            </xsl:copy>
            </xsl:if>
    </xsl:template>

    <!-- **************************** -->
    <!-- CSS Examples (e.g. fo:table) -->
    <!-- **************************** -->

    <xsl:template match="fo:table-cell[not(@padding)]" mode="css">
        <xsl:attribute name="padding" select="'2pt'"/>
        <xsl:next-match/>
    </xsl:template>

    <xsl:template match="fo:table-header/fo:table-row/fo:table-cell" mode="css">
        <xsl:attribute name="color" select="'black'"/>
        <xsl:attribute name="font-style" select="'bold'"/>
        <xsl:next-match/>
    </xsl:template>

</xsl:transform>
person Joep    schedule 10.05.2012