У нас есть xml узел "объект" с атрибутом "стиль", который является "Header1". Этот стиль может измениться как бы то ни было. У нас есть набор атрибута по имени Header1, который определяет, как это должно посмотреть в PDF, сгенерированном через xsl:fo.
Это работает (наборы атрибута использования упоминается встроенный, в узле fo:table-ячейки):
<xsl:template match="item[@type='label']">
<fo:table-row>
<fo:table-cell xsl:use-attribute-sets="Header1">
<fo:block>
<fo:inline font-size="8pt" >
<xsl:value-of select="." />
</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
Но это не делает (использующий xsl:attribute, потому что атрибут @style может также быть Header2, например). Это не генерирует ошибку, PDF создается, но атрибуты не применяются.
<xsl:template match="item[@type='label']">
<fo:table-row>
<fo:table-cell>
<xsl:attribute name="xsl:use-attribute-sets">
<xsl:value-of select="@style" />
</xsl:attribute>
<fo:block>
<fo:inline font-size="8pt" >
<xsl:value-of select="." />
</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
Кто-либо знает почему? И как мы могли достигнуть этого, предпочтительно без длинного xsl:if или материала xsl:when?
Из http://www.w3.org/TR/xslt#attribute-sets
Наборы атрибутов используются путем указания атрибута use-attribute-sets на элементах xsl:element, xsl:copy [...] или xsl:attribute-set
Из http://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element
<!-- Category: instruction -->
<xsl:element
name = { qname }
namespace = { uri-reference }
use-attribute-sets = qnames>
<!-- Content: template -->
</xsl:element>
И http://www.w3.org/TR/xslt#copying
<!-- Category: instruction -->
<xsl:copy
use-attribute-sets = qnames>
<!-- Content: template -->
</xsl:copy>
Итак, ясно, что это не может быть AVT (динамически определенным).
Примечание: О буквальном элементе результата, в спецификации сказано: Наборы атрибутов также могут быть использованы путем указания атрибута xsl:use-attribute-sets на буквальном элементе результата. Это на редкость расплывчато о разрешении AVT. Предположим, что нет.
О втором примере: с помощью этого шаблона вы добавляете атрибут "xsl:use-attribute-sets" в дерево результатов. Он не интерпретируется XSLT-процессором.
Тогда каково решение? Вы должны избавиться от "xsl:use-attribute-sets". Примените правило шаблона для "@style" и генерируйте нужные атрибуты там.
Попробуйте:
<fo:table-cell xsl:use-attribute-sets="{@style}">