0

我正在通过 Apache-FOP 项目将我的 XML 文档转换为 PDF 文档,到目前为止一切顺利。除了,我有它以后不容易配置。我的代码片段是这样的,

<fo:table-cell>
    <fo:block margin-top="5pt" text-align="left"><xsl:value-of select="" /></fo:block>
</fo:table-cell>
<fo:table-cell>
    <fo:block margin-top="5pt" text-align="center"><xsl:value-of select="" /></fo:block>
</fo:table-cell>
<fo:table-cell>
    <fo:block margin-top="5pt" text-align="center"><xsl:value-of select="" /></fo:block>
</fo:table-cell>
<fo:table-cell>
    <fo:block margin-top="5pt" text-align="center"><xsl:value-of select="" /></fo:block>
</fo:table-cell>
<fo:table-cell>
    <fo:block margin-top="5pt" text-align="center"><xsl:value-of select="" /></fo:block>
</fo:table-cell>
<fo:table-cell>
     <fo:block margin-top="5pt" text-align="center"><xsl:value-of select="" /></fo:block>
</fo:table-cell>

正如您在上面的代码中看到的那样,我margin-top="5pt" text-align="center"经常这样做。我试图找到一种方法,这样我就可以只写一次这个值,然后我可以改变一个变量,然后影响每个人。


研究发现:

到目前为止,我发现我可以在 XSLT 中使用一个参数并定义一个变量。后来,我可以使用,参数值可以是5pt。然后我像这样使用它。

<xsl:attribute name="margin-top">$var</xsl:attribute>

但这不是一个好的解决方案,因为它使我的代码完全不可读(虽然不完全,但你知道我的意思)。XSLT 中有类似 CSS 的东西吗?

4

1 回答 1

4

使用xsl:attribute可能是一种相当冗长的方法。最好在此处使用“属性值模板”,它允许您在线指定代码

<fo:block margin-top="{$var}" text-align="{$var2}">

花括号表示该值是要计算的表达式,而不是字面输出。

从这里继续,我认为xsl:attribute-set可能是你的朋友。这将允许您创建一组属性,这些属性可以在以后应用于任何元素。首先,您将定义您的属性集,如下所示:(注意,这应该在xsl:stylesheet元素下)

<xsl:attribute-set name="block">
  <xsl:attribute name="margin-top">5pt</xsl:attribute>
  <xsl:attribute name="text-align">left</xsl:attribute>
</xsl:attribute-set> 

然后,要使用它,您可以只使用xsl:use-attribute-sets属性

<fo:block xsl:use-attribute-sets="block">

这应该输出以下内容:

<fo:block margin-top="5pt" text-align="left">

此外,如果您希望从调用程序中设置值,您仍然可以“参数化”您的属性集。例如,以下内容也应该有效

<xsl:param name="margin-top" select="'6pt'" />
<xsl:param name="text-align" select="'left'" />

<xsl:attribute-set name="block">
  <xsl:attribute name="margin-top"><xsl:value-of select="$margin-top" /></xsl:attribute>
  <xsl:attribute name="text-align"><xsl:value-of select="$text-align" /></xsl:attribute>
</xsl:attribute-set> 
于 2012-10-11T15:35:51.597 回答