Как мне заставить мою таблицу xsl-fo отображаться как таблица? - PullRequest
0 голосов
/ 30 октября 2018

Я пробую пример xsl-fo, который должен создать таблицу, но когда я ее запускаю, он показывает данные бок о бок без строк или ячеек таблицы. Как мне сделать так, чтобы он отображался правильно?

У меня есть тег таблицы стилей в файле .xml, поэтому, когда я щелкаю его правой кнопкой мыши и выбираю Открыть с помощью Internet Explorer, он должен переводиться с файлом .xslt.

Ожидаемый вывод, два выхода будут в отдельных строках,
ФО Первый Офис
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>

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы ничего не говорите о процессоре XSL FO. XSL FO - это язык разметки, который приложение интерпретирует и создает вывод. Это то же самое, что и HTML ... для HTML браузер интерпретирует теги HTML и стили CSS и дает вам «составное» представление в браузере.

Чтобы сделать то же самое с XSL FO, вы используете какой-то процессор XSL FO, который интерпретирует разметку XSL FO и создает выходные данные (может быть PDF или Postscript или многие другие составные выходные данные, такие как AFP, PCL, XPS, ...)

Чтобы получить действительно форматированный вывод из XSL FO, вам нужен процессор XSL FO. Ни один браузер не делает этого. Существует Apache FOP в мире открытого ПО или коммерческих приложениях, таких как RenderX XEP или AntennaHouse.

0 голосов
/ 30 октября 2018

Я не знаю современного браузера, который изначально поддерживает XSL-FO.

Таким образом, вы либо непосредственно преобразуете в HTML, либо преобразуете свой вывод XSL-FO в HTML на втором этапе с другим XSLT.


Примером второго подхода, снова преобразовывающего вывод, является:

<?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, который можно отобразить в браузере.

...