Есть ли что-то вроде CSS, встроенного в XSL-FO?
Я знаю, что сам XSLT имеет набор атрибутов, но это заставляет меня использовать
<xsl:element name="fo:something">
каждый раз, когда я хочу вывести
<fo:something>
тег. Есть ли что-нибудь в спецификации XSL-FO, которая позволит мне указать (допустим) набор атрибутов по умолчанию (margin, padding и т.д.) Для всех таблиц на выходе FO?
По сути, я ищу функциональность CSS, но для вывода FO вместо HTML.
Ответы
Ответ 1
Нет, вам не требуется использовать элемент xsl:, атрибут атрибутов use-attribute может появляться в литеральных элементах результата, если вы поместите его в пространство имен 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>
Ответ 2
В 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>