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

У нас есть xml-узел "item" с атрибутом "style", который является "Header1". Однако этот стиль может измениться. У нас есть набор атрибутов с именем Header1, который определяет, как это должно выглядеть в PDF, сгенерированном с помощью xsl: fo.

Это работает (наборы атрибутов использования упоминаются inline, в узле fo: table-cell):

<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 stuff?

Ответы [ 3 ]

6 голосов
/ 08 июня 2010

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

0 голосов
/ 22 мая 2012

Используйте переменную для определения style, переменную для true, переменную для false и переменную для динамической ссылки на одну из них с использованием конкатенации строк:

<xsl:variable name="style">
  <xsl:value-of select="concat(boolean(@style),boolean(not(@style) ) )"/>
</xsl:variable>

<xsl:variable name="falsetrue" select="'foo'"/>
<xsl:variable name="truefalse" select="'bar'"/>
<!--...-->


<xsl:value-of select="//xsl:variable/@select[../@name='style']"/>

Или вы можете сделать так, чтобы шаблоны соответствовали друг другу, и вызывать их, используя значение "style":

<xsl:template name="Header1" match="xsl:template[@name='Header1']"/>

<xsl:template name="Header2" match="xsl:template[@name='Header2']"/>
0 голосов
/ 08 июня 2010

Попробуйте

<fo:table-cell xsl:use-attribute-sets="{@style}">
...