6

我们有一个带有属性“style”的xml节点“item”,即“Header1”。然而,这种风格可以改变。我们有一个名为 Header1 的属性集,它定义了它在 PDF 中的外观,通过 xsl:fo 生成。

这有效(在 fo:table-cell 节点中内联提到了 use-attribute-sets):

<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 东西?

4

3 回答 3

6

来自http://www.w3.org/TR/xslt#attribute-sets

通过在 xsl:element、xsl:copy [...] 或 xsl:attribute-set 元素上指定 use-attribute-sets 属性来使用属性集

来自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”应用模板规则并在那里生成所需的属性。

于 2010-06-08T16:33:03.947 回答
0

尝试

<fo:table-cell xsl:use-attribute-sets="{@style}">
于 2010-06-08T16:47:03.573 回答
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']"/>
于 2012-05-22T00:28:20.213 回答