Board logo

标题: HTML 至格式化对象(FO)转换指南(10)命名锚点引用 [打印本页]

作者: look_w    时间: 2018-7-15 08:38     标题: HTML 至格式化对象(FO)转换指南(10)命名锚点引用

<td> 表单元HTML                 <td> 元素直接映射至 XSL-FO                 <fo:table-cell> 元素。缺省情况下,模板要求表单元的顶部、底部以及左右两边各留有距离为 3 点的空间。有三种 HTML 属性需要处理:                 colspan 、                 rowspan 和                 align 。您还要以有限的方式处理                 border 属性。            
colspan 和                 rowspan 属性直接映射成 XSL-FO                 number-columns-spanned 和                 number-rows-spanned 属性,因此处理它们并不困难。            
HTML                 align 属性映射成 XSL-FO                 text-align 属性,但有两组不同的值。HTML                 align 的                 left 、                 center 、                 right 和                 justify 值映射成 XSL-FO                 text-align 的                 start 、                 center 、                 end 和                 justify 。这里最后的复杂之处在于可能在 HTML                 <td> 、                 <tr> 、                 <thead> 或                 <table> 元素上出现对齐值,因此必须检查所有的祖先元素直到找到该值为止。(注:在                 <fo:block> 元素上设置                 text-align 属性,而不是在                 <fo:table-cell> 上。)            
最后,如果                 <td> 、                 <tr> 、                 <thead> 或                 <table> 元素有                 border="1" 属性,则用                 border-style="solid" border-color="black" border-width="1pt" 这三个 XSL-FO 属性在表单元的四周绘制边框。            
以下是完整的 XSLT 模板,其中的大多数由确定使用哪种 XSL-FO 属性的                 <xsl:choose> 元素所组成:            
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<xsl:template match="td">
   
         
        <fo:table-cell
    padding-start="3pt" padding-end="3pt"
    padding-before="3pt" padding-after="3pt">
    <xsl:if test="@colspan">
      <xsl:attribute name="number-columns-spanned">
        <xsl:value-of select="@colspan"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@rowspan">
      <xsl:attribute name="number-rows-spanned">
        <xsl:value-of select="@rowspan"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="@border='1' or
                  ancestor::tr[@border='1'] or
                  ancestor::thead[@border='1'] or
                  ancestor::table[@border='1']">
      <xsl:attribute name="border-style">
        <xsl:text>solid</xsl:text>
      </xsl:attribute>
      <xsl:attribute name="border-color">
        <xsl:text>black</xsl:text>
      </xsl:attribute>
      <xsl:attribute name="border-width">
        <xsl:text>1pt</xsl:text>
      </xsl:attribute>
    </xsl:if>
    <xsl:variable name="align">
      <xsl:choose>
        <xsl:when test="@align">
          <xsl:choose>
            <xsl:when test="@align='center'">
              <xsl:text>center</xsl:text>
            </xsl:when>
            <xsl:when test="@align='right'">
              <xsl:text>end</xsl:text>
            </xsl:when>
            <xsl:when test="@align='justify'">
              <xsl:text>justify</xsl:text>
            </xsl:when>
            <xsltherwise>
              <xsl:text>start</xsl:text>
            </xsltherwise>
          </xsl:choose>
        </xsl:when>
        <xsl:when test="ancestor::tr[@align]">
          <xsl:choose>
            <xsl:when test="ancestor::tr/@align='center'">
              <xsl:text>center</xsl:text>
            </xsl:when>
            <xsl:when test="ancestor::tr/@align='right'">
              <xsl:text>end</xsl:text>
            </xsl:when>
            <xsl:when test="ancestor::tr/@align='justify'">
              <xsl:text>justify</xsl:text>
            </xsl:when>
            <xsltherwise>
              <xsl:text>start</xsl:text>
            </xsltherwise>
          </xsl:choose>
        </xsl:when>
        <xsl:when test="ancestor::thead">
          <xsl:text>center</xsl:text>
        </xsl:when>
        <xsl:when test="ancestor::table[@align]">
          <xsl:choose>
            <xsl:when test="ancestor::table/@align='center'">
              <xsl:text>center</xsl:text>
            </xsl:when>
            <xsl:when test="ancestor::table/@align='right'">
              <xsl:text>end</xsl:text>
            </xsl:when>
            <xsl:when test="ancestor::table/@align='justify'">
              <xsl:text>justify</xsl:text>
            </xsl:when>
            <xsltherwise>
              <xsl:text>start</xsl:text>
            </xsltherwise>
          </xsl:choose>
        </xsl:when>
        <xsltherwise>
          <xsl:text>start</xsl:text>
        </xsltherwise>
      </xsl:choose>
    </xsl:variable>
     
         
        <fo:block text-align="{$align}">
      <xsl:apply-templates select="*|text()"/>
    </fo:block>
  </fo:table-cell>
</xsl:template>






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0