2009-06-10 1 views
10

Я знаю, что сам по себе XSLT имеет атрибут наборы, но это заставляет меня использоватьЕсть ли что-то вроде CSS, встроенного в XSL-FO?

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

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

<fo:something> 

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

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

+0

См https://stackoverflow.com/a/21345708/287948 о замене старого XSL-FO более новыми вещами веб-стандартах экосистемы –

ответ

11

Нет, вы не обязаны использовать XSL: элемент, потребительная атрибут наборы атрибутов могут появляться на буквенных элементов результата, если вы поместите его в пространстве имен 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> 
+0

не так заинтересованы в рекурсивных вещах идентичности в нижней части этого ответа, но простое дополнение наборов xsl: use-attribute прекрасно работает. Вы действительно можете добавить несколько ссылок на набор атрибутов, как в (use-attribute-sets = "attributeSet1 attributeSet2"), так что он фактически действует ОЧЕНЬ МНОГО НРАВИТСЯ CSS! Отлично! –

0

В 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> 

 Смежные вопросы

  • Нет связанных вопросов^_^