Как я могу объединить xsl:attribute и xsl:use-attribute-sets для условного использования набора атрибута?

У нас есть 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?

6
задан Peter 8 June 2010 в 14:09
поделиться

2 ответа

Из 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" и генерируйте нужные атрибуты там.

6
ответ дан 17 December 2019 в 02:24
поделиться

Попробуйте:

<fo:table-cell xsl:use-attribute-sets="{@style}">
0
ответ дан 17 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: