如何让我的 xsl-fo table 像 table 一样显示?

How do I get my xsl-fo table to display like a table?

我正在尝试一个 xsl-fo 示例,它应该是 table,但是当我 运行 它并排显示数据时没有 table 行或细胞。如何让它正确显示?

我在 .xml 文件中有一个样式表标签,所以当我右键单击它并选择“使用 Internet Explorer 打开”时,它应该用 .xslt 文件翻译它。

预期输出这两个输出将在不同的行中,
FO 第一办公室
FO 第二办公室

我的代码

personnel_roster2.xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match='/rows'>
        <fo:root>

          <fo:layout-master-set>
            <fo:simple-page-master master-name="hello"
                        page-height="11in"  page-width="8.5in" margin-top="1in" 
                        margin-bottom="1in" margin-left="0in" margin-right="1in">
              <fo:region-body margin-top="1in" margin-bottom=".5in"/>
            </fo:simple-page-master>
          </fo:layout-master-set>

            <fo:page-sequence master-reference="hello">
                <fo:flow flow-name="xsl-region-body">
                    <fo:table>
                        <xsl:for-each select="row">
                            <fo:table-row>
                                <fo:table-cell>
                                    <fo:block font-weight="bold"><xsl:value-of select="@Office"/></fo:block>
                                </fo:table-cell>
                                <fo:table-cell>
                                    <fo:block font-weight="bold"><xsl:value-of select="@OfficeTitle"/></fo:block>
                                </fo:table-cell>
                            </fo:table-row>
                        </xsl:for-each>
                    </fo:table>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>
</xsl:stylesheet>

personnel_roster2.xml

<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "personnel_roster2.xslt"?> 
<rows appMode="DEV" dateGenerated="">
    <row OfficeID="32" OfficeOutputOrder="1" Office="FO" OfficeTitle="First Office" RoomFaxID="88" RoomFaxNumber="" RoomNumberID="123">
        <personnel>
            <person PersonnelID="3870" Name="The Boss" PositionRoomNumberID="31" phone="555-647-5770" PAETitle="" PositionEmployeeTypeID="C" PositionOutputOrder="1" />
        </personnel>
        <officeFaxes>
             <fax RoomNumberID="123" RoomFaxNumber="" OfficeID="32" />
        </officeFaxes>
    </row>
    <row OfficeID="33" OfficeOutputOrder="1" Office="FO" OfficeTitle="Second Office" RoomFaxID="88" RoomFaxNumber="" RoomNumberID="123">
        <personnel>
            <person PersonnelID="3870" Name="The Boss" PositionRoomNumberID="31" phone="555-647-5770" PAETitle="" PositionEmployeeTypeID="C" PositionOutputOrder="1" />
        </personnel>
        <officeFaxes>
             <fax RoomNumberID="123" RoomFaxNumber="" OfficeID="33" />
        </officeFaxes>
    </row>
</rows>

我不知道有哪个现代浏览器原生支持 XSL-FO。

因此,您要么直接转换为 HTML,要么在第二步中使用不同的 XSLT 将 XSL-FO 输出转换为 HTML。


第二种方法的示例,再次转换输出,是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/fo:root/fo:page-sequence/fo:flow">
        <html>
            <body>
                <xsl:for-each select="fo:table">
                    <table border="1">
                        <xsl:for-each select="fo:table-row">
                            <tr>
                                <xsl:for-each select="fo:table-cell">
                                    <td style="font-weight:{fo:block/@font-weight};">
                                        <xsl:value-of select="fo:block" />
                                    </td>
                                </xsl:for-each>
                            </tr>
                        </xsl:for-each>
                    </table>
                </xsl:for-each>
            </body>
        </html>
     </xsl:template>    

</xsl:stylesheet>

这会将第一个 XSLT 的输出转换为 HTML 可以在浏览器中显示的文件。

您没有说明任何有关 XSL FO 处理器的信息。 XSL FO 是应用程序解释和创建输出的标记语言。这与 HTML 相同 ... 对于 HTML,浏览器会解释 HTML 标记和 CSS 样式,并在浏览器中为您提供 "composed" 视图。

要对 XSL FO 做同样的事情,您可以使用一些 XSL FO 处理器来解释 XSL FO 标记并创建输出(可以是 PDF 或 Postscript 或许多其他组合输出,如 AFP、PCL、XPS、 ...)

要从 XSL FO 获得真正的格式化输出,您需要一个 XSL FO 处理器。没有浏览器这样做。开源世界中有 Apache FOP 或 RenderX XEP 或 AntennaHouse 等商业应用程序。