我们有一个xml节点“item”,其属性为“style”,即“Header1”。但是这种风格可以改变。我们有一个名为Header1的属性集,它定义了在xsl:fo生成的PDF中的外观。
这是有效的(在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:属性,因为@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?
答案 0 :(得分:6)
来自http://www.w3.org/TR/xslt#attribute-sets
通过在xsl:element,xsl:copy [...]或xsl:attribute-set elements
上指定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”应用模板规则并在那里生成所需的属性。
答案 1 :(得分:0)
<强>尝试强>:
<fo:table-cell xsl:use-attribute-sets="{@style}">
答案 2 :(得分: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']"/>