Как сделать так, чтобы моя таблица xsl-fo отображалась как таблица?

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

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

Ожидаемый результат: два выхода будут в отдельных строках,
FO Первый офис
FO Второй офис

Мой код

staff_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>

staff_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>
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
739
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не знаю современного браузера, который изначально поддерживает 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, который можно отобразить в браузере.

если OP хочет отобразить в браузере, я бы полностью пропустил шаг XSLFO и просто использовал XSLT, который вместо этого преобразует входной XML в HTML.

Hobbes 31.10.2018 10:44

@Hobbes: Я знаю это, я упомянул об этом во вступлении. Но это тоже возможно.

zx485 31.10.2018 14:44
Ответ принят как подходящий

Вы ничего не говорите о процессоре 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.

Другие вопросы по теме