2010-06-08 1 views
5

У нас есть элемент xml node с атрибутом «style», который является «Header1». Однако этот стиль может измениться. У нас есть набор атрибутов с именем Header1, который определяет, как это должно выглядеть в PDF, сгенерированном через xsl: fo.Как я могу объединить атрибуты xsl: attribute и xsl: use-attribute для условного использования набора атрибутов?

Это работает (потребительная атрибутов наборы упоминается встроенный в ВОК: узел таблицы ячейки):

Но это не (с помощью XSL: атрибут, так как атрибут @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?

ответ

5

От http://www.w3.org/TR/xslt#attribute-sets

наборов атрибутов используются определение атрибутов потребительных атрибутов наборов на XSL: элемент, XSL: копия [...] или XSL: атрибут-наборе элементы

С 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: атрибут потребительных атрибутов наборов на конечный элементе. Это редкое расплывчатое о разрешении AVT. Предположим, что нет.

О втором примере: с этим шаблоном вы добавляете атрибут «xsl: use-attribute-sets» в дерево результатов. Он не испробован процессором XSLT.

Тогда какое решение? Вам нужно избавиться от «xsl: use-attribute-sets». Примените правило шаблона для «@style» и создайте там нужные атрибуты.

0

Попробуйте:

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

Нет, не получится. Мы получаем следующую ошибку: «Символ« {», шестнадцатеричное значение 0x7B, не может быть включен в имя». – Peter

0

Используйте переменную для определения 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']"/>