Что не так с моим кодом xsl-fo

Я пытаюсь создать PDF-файл с помощью apache-fop из следующей команды.

C:\fop-1.0-bin\fop-1.0>fop -xml sample1.xml -xsl xsl-fo.xsl -pdf sample2.pdf

Мой xml выглядит так

<?xml version="1.0" encoding="iso-8859-1"?>
<service>
    <serviceId>11111</serviceId>
    <openDate>2012-02-16</openDate>
    <closeDate>2012-02-16</closeDate>
    <description>INSPECT MACHINE</description>
    <repairCost>$266.76</repairCost>
</service>

Мой файл xsl-fo xslt выглядит так

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    >
    <xsl:output encoding="iso-8859-1" />
    <xsl:template match ="Service">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="Service">
                    <fo:region-body></fo:region-body>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <fo:page-sequence master-reference="Service">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block>
                        <fo:table>
                            <fo:table-body>
                                <fo:table-row>
                                    <fo:table-cell border="solid 1px black" 
                                    text-align="center" font-weight="bold">
                                        <fo:block>Service Id</fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px black" 
                                    text-align="center" font-weight="bold">
                                        <fo:block>Open Date</fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px black" 
                                    text-align="center" font-weight="bold">
                                        <fo:block>Close Date</fo:block>
                                    </fo:table-cell>                                    
                                    <fo:table-cell border="solid 1px black" 
                                    text-align="center" font-weight="bold">
                                        <fo:block>Order Status</fo:block>
                                    </fo:table-cell>                                    
                                    <fo:table-cell border="solid 1px black" 
                                    text-align="center" font-weight="bold">
                                        <fo:block>Description</fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px black" 
                                    text-align="center" font-weight="bold">
                                        <fo:block>Repair Cost</fo:block>
                                    </fo:table-cell>
                                </fo:table-row>
                                <xsl:for-each select="./servicetype">
                                    <fo:table-row>
                                        <fo:table-cell border="solid 1px bold" text-align="center">
                                            <fo:block><xsl:value-of select="serviceId" /></fo:block>
                                        </fo:table-cell>
                                        <fo:table-cell border="solid 1px bold" text-align="center">
                                            <fo:block><xsl:value-of select="openDate" /></fo:block>
                                        </fo:table-cell>
                                        <fo:table-cell border="solid 1px bold" text-align="center">
                                            <fo:block><xsl:value-of select="closeDate" /></fo:block>
                                        </fo:table-cell>                                

                                        <fo:table-cell border="solid 1px bold" text-align="center">
                                            <fo:block><xsl:value-of select="description" /></fo:block>
                                        </fo:table-cell>
                                        <fo:table-cell border="solid 1px bold" text-align="center">
                                            <fo:block><xsl:value-of select="repairCost" /></fo:block>
                                        </fo:table-cell>
                                    </fo:table-row>
                                </xsl:for-each>
                            </fo:table-body>
                        </fo:table>
                    </fo:block>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>
</xsl:stylesheet>

Я получаю сообщение об ошибке. Может кто-нибудь указать на мою ошибку в коде. Я следую этому примеру http://www.codeproject.com/Articles/37663/PDF-Generation-using-XSLFO-and-FOP

SEVERE: org.apache.fop.fo.ValidationException: Document is empty (something migh
t be wrong with your XSLT stylesheet).
Dec 3, 2012 4:27:27 PM org.apache.fop.cli.Main startFOP
SEVERE: Exception
javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException:
 Document is empty (something might be wrong with your XSLT stylesheet).
        at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
        at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
        at org.apache.fop.cli.Main.startFOP(Main.java:174)
        at org.apache.fop.cli.Main.main(Main.java:205)
Caused by: javax.xml.transform.TransformerException: org.apache.fop.fo.Validatio
nException: Document is empty (something might be wrong with your XSLT styleshee
t).
        at org.apache.xalan.transformer.TransformerImpl.transformNode(Transforme
rImpl.java:1430)
        at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImp
l.java:709)
        at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImp
l.java:1284)
        at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImp
l.java:1262)
        at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
        ... 3 more
Caused by: org.apache.fop.fo.ValidationException: Document is empty (something m
ight be wrong with your XSLT stylesheet).
        at org.apache.fop.events.ValidationExceptionFactory.createException(Vali
dationExceptionFactory.java:38)
        at org.apache.fop.events.EventExceptionManager.throwException(EventExcep
tionManager.java:54)
        at org.apache.fop.events.DefaultEventBroadcaster$1.invoke(DefaultEventBr
oadcaster.java:175)
        at $Proxy0.emptyDocument(Unknown Source)
        at org.apache.fop.fo.FOTreeBuilder.endDocument(FOTreeBuilder.java:158)
        at org.apache.xml.serializer.ToXMLSAXHandler.endDocument(ToXMLSAXHandler
.java:181)
        at org.apache.xalan.transformer.TransformerImpl.transformNode(Transforme
rImpl.java:1378)
        ... 7 more

person user525146    schedule 03.12.2012    source источник
comment
XSLT 1.1 был проектом, от которого отказались, и его не следует использовать.   -  person Mads Hansen    schedule 04.12.2012


Ответы (3)


попробуйте изменить xpath в foreach

<xsl:for-each select="./service">

XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<services>
    <service>
        <serviceId>11111</serviceId>
        <openDate>2012-02-16</openDate>
        <closeDate>2012-02-16</closeDate>
        <orderStatus>Status2</orderStatus>
        <description>INSPECT MACHINE</description>
        <repairCost>$266.76</repairCost>
    </service>
    <service>
        <serviceId>11111</serviceId>
        <openDate>2012-02-16</openDate>
        <closeDate>2012-02-16</closeDate>
        <orderStatus>Status1</orderStatus>
        <description>INSPECT MACHINE</description>
        <repairCost>$266.76</repairCost>
    </service>
</services>

xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output encoding="iso-8859-1" />
<xsl:template match ="services">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <fo:layout-master-set>
            <fo:simple-page-master master-name="service">
                <fo:region-body></fo:region-body>
            </fo:simple-page-master>
        </fo:layout-master-set>

        <fo:page-sequence master-reference="service">
            <fo:flow flow-name="xsl-region-body">
                <fo:block>
                    <fo:table>
                        <fo:table-body>
                            <fo:table-row>
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Service Id</fo:block>
                                </fo:table-cell>
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Open Date</fo:block>
                                </fo:table-cell>
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Close Date</fo:block>
                                </fo:table-cell>                                    
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Order Status</fo:block>
                                </fo:table-cell>                                    
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Description</fo:block>
                                </fo:table-cell>
                                <fo:table-cell border="solid 1px black" 
                                text-align="center" font-weight="bold">
                                    <fo:block>Repair Cost</fo:block>
                                </fo:table-cell>
                            </fo:table-row>
                            <xsl:for-each select="./service">
                                <fo:table-row>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="serviceId" /></fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="openDate" /></fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="closeDate" /></fo:block>
                                    </fo:table-cell>                                
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="orderStatus" /></fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="description" /></fo:block>
                                    </fo:table-cell>
                                    <fo:table-cell border="solid 1px bold" text-align="center">
                                        <fo:block><xsl:value-of select="repairCost" /></fo:block>
                                    </fo:table-cell>
                                </fo:table-row>
                            </xsl:for-each>
                        </fo:table-body>
                    </fo:table>
                </fo:block>
            </fo:flow>
        </fo:page-sequence>
    </fo:root>
</xsl:template>
</xsl:stylesheet>
person Community    schedule 03.12.2012
comment
Важно, чтобы шаблон соответствовал ‹xsl:template match =services›, а для каждого — ‹xsl:for-each select=./service›. также файл xml должен иметь корень с именем services. Я пробовал это сам, и он генерирует PDF - person ; 04.12.2012
comment
Я скопировал код, который вы вставили в ответ, проверил теги и попробовал, это не удалось - person user525146; 04.12.2012
comment
Вы использовали тот же XML? ‹xsl:template match =services› соответствует корню xml. ‹xsl:for-each select=./service› перебирает каждый элемент службы. Я пробовал это несколько раз, и каждый раз он генерирует PDF-файл, хотя я заметил, что имена столбцов и значения столбцов не совсем совпадают. Вам нужно добавить значение для столбца статуса заказа - person ; 04.12.2012
comment
Большое спасибо, я удалил старые файлы и создал новые, после чего все заработало, но выдало некоторые предупреждения Dec 3, 2012 8:43:40 PM org.apache.fop.events.LoggingEventListener processEvent WARNING: The following feature isn't implemented by Apache FOP, yet: table-layou t="auto" (on fo:table) (No context info available) Dec 3, 2012 8:43:41 PM org.apache.fop.events.LoggingEventListener processEvent WARNING: Font "Symbol,normal,700" not found. Substituting with "Symbol,normal,40 0". - person user525146; 04.12.2012

Может ли это быть так же просто, как проблема с корпусом? В вашем образце XML в качестве корневого тега используется <service>, но у вас есть <xsl:template match="Service"> (заглавная S).

person dbrobins    schedule 03.12.2012

FOP не поддерживает автоматический макет таблицы и вместо этого использует фиксированный макет таблицы.

Автоматическая верстка не поддерживается FOP, так как страница имеет статическую ширину [A4, A3...] автоматический режим поддерживается только при рендеринге html, так как размер страницы мог меняться (в зависимости от разрешения, изменение размера окно...) см.:

http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-dev/200510.mbox/%[email protected]%3E

http://wiki.apache.org/xmlgraphics-fop/Troubleshooting/CommonLogMessage

Примечание. Чтобы избежать предупреждения, вы должны указать table-layout="fixed" и использовать width="100%" и "*" при определении ширины столбцов.

person yayaman    schedule 18.06.2013