XSL-FO 中是不是有“类似”的 CSS?

Posted

技术标签:

【中文标题】XSL-FO 中是不是有“类似”的 CSS?【英文标题】:Is there something "like" CSS built into XSL-FO?XSL-FO 中是否有“类似”的 CSS? 【发布时间】:2010-11-01 22:46:05 【问题描述】:

我知道 XSLT 本身有属性集,但这迫使我使用

<xsl:element name="fo:something">

每次我想输出一个

<fo:something>

标签。 XSL-FO 规范中是否有任何内容允许我为 FO 输出中的所有表指定(比方说)一组默认属性(边距、填充等)?

基本上我正在寻找 CSS 的功能,但寻找的是 FO 输出而不是 html

【问题讨论】:

请参阅***.com/a/21345708/287948,了解用 Web 标准生态系统的新事物替换旧的 XSL-FO 【参考方案1】:

在 XSLT 2.0 中还有另一个选项。 以下模板可以在单独的文件中。您只需将该文件包含在生成 FO 结构的原始 xsl 文件中即可。

<xsl:transform 
    version="2.0"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/" priority="1000">
        <!-- Store generated xsl-fo document in variable-->
        <xsl:variable name="xsl-fo-document">
            <xsl:next-match/>
        </xsl:variable>

        <!-- Copy everything to result document and apply "css" -->
        <xsl:apply-templates select="$xsl-fo-document" mode="css"/>
    </xsl:template>

    <xsl:template match="@*|node()" priority="1000" mode="css">
        <xsl:param name="copy" select="true()" tunnel="yes"/>
        <xsl:if test="$copy">
            <xsl:copy>
                <xsl:next-match>
                    <xsl:with-param name="copy" select="false()" tunnel="yes"/>
                </xsl:next-match>
                <xsl:apply-templates select="@*|node()" mode="css"/>
            </xsl:copy>
            </xsl:if>
    </xsl:template>

    <!-- **************************** -->
    <!-- CSS Examples (e.g. fo:table) -->
    <!-- **************************** -->

    <xsl:template match="fo:table-cell[not(@padding)]" mode="css">
        <xsl:attribute name="padding" select="'2pt'"/>
        <xsl:next-match/>
    </xsl:template>

    <xsl:template match="fo:table-header/fo:table-row/fo:table-cell" mode="css">
        <xsl:attribute name="color" select="'black'"/>
        <xsl:attribute name="font-style" select="'bold'"/>
        <xsl:next-match/>
    </xsl:template>

</xsl:transform>

【讨论】:

【参考方案2】:

不,你不需要使用 xsl:element,如果你将 use-attribute-sets 属性放在 XSLT 命名空间中,它可以出现在文字结果元素上,所以你可以使用类似的东西:

<fo:something xsl:use-attribute-sets="myAttributeSet">

如果您想要一些接近 CSS 功能的东西,那么您可以在处理结束时添加另一个 XSLT 转换,以添加您想要的属性。您可以从递归身份转换开始,然后在要更改的元素上添加匹配的模板,请参见下面的小示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:attribute-set name="commonAttributes">
    <xsl:attribute name="common">value</xsl:attribute>
  </xsl:attribute-set>
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="someElement">
    <xsl:copy use-attribute-sets="commonAttributes">
      <xsl:attribute name="someAttribute">someValue</xsl:attribute>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

对这个答案底部的递归身份的东西不感兴趣,但是 xsl:use-attribute-sets 的简单添加效果很好。实际上,您可以像 (use-attribute-sets="attributeSet1 attributeSet2") 中那样添加多个属性集引用,因此它实际上非常像 CSS!太棒了!

以上是关于XSL-FO 中是不是有“类似”的 CSS?的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有嵌入图像的 XHTML+CSS 转换为 XSL-FO?

指定自定义字体

MUI 5 中是不是有类似 Emotions 'css' 功能的功能?

jQuery 中是不是有类似于 :eq() 的标准 CSS 选择器?

CSS 是不是有类似 jQuery 的 :has() 的东西?

为啥 CSS3 PIE 和其他类似的脚本不是到处都在使用?