XSLT-FO apply-templates - PullRequest
       15

XSLT-FO apply-templates

0 голосов
/ 01 июня 2019

У меня есть XML-файл

<results xmlns="zwierzeta">
    <animal family="kurowate" genus="tetrao">
        <name>skrzekot</name>
        <food>wszystkożerca</food> 
    </animal>
    <animal family="kurowate" genus="lyrurus">
        <name>cietrzew</name>
        <status>zagrożony</status>
        <food>wszystkożerca</food> 
        <lifespan>15</lifespan>
    </animal>
    <animal family="kurowate" genus="tetrao">
        <name>głuszec</name>
        <status>zagrożony</status>
        <food>wszystkożerca</food> 
        <lifespan>12</lifespan>
    </animal>
</results>

И я пытаюсь создать простую таблицу с тремя столбцами: имя, статус, еда.

Мой xsl-файл:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns="zwierzeta" xmlns:a="anatomia">

    <xsl:template match="/">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="wzorzec1" page-width="210mm" page-height="297mm" margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
                    <fo:region-body margin="3cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="wzorzec1">
                <fo:flow flow-name="xsl-region-body" font-family="Arial">
                    <fo:block font-size="20" text-align="center">Raport</fo:block>
                    <fo:table border="1pt solid black" text-align="center" border-spacing="2pt">
                        <fo:table-header>
                            <fo:table-row>
                                <fo:table-cell border="1pt solid black"> <fo:block>Nazwa</fo:block> </fo:table-cell>
                                <fo:table-cell border="1pt solid black"> <fo:block>Status</fo:block> </fo:table-cell>
                                <fo:table-cell border="1pt solid black"> <fo:block>Odzywianie</fo:block> </fo:table-cell>
                            </fo:table-row>
                        </fo:table-header>
                        <fo:table-body>
                            <xsl:apply-templates select="animal"/>
                        </fo:table-body>
                    </fo:table>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template match="animal">
        <fo:table-row>
            <fo:table-cell border="1pt solid black">
                <fo:block><xsl:value-of select="name"/></fo:block>
            </fo:table-cell>
            <fo:table-cell border="1pt solid black">
                <fo:block><xsl:value-of select="status"/></fo:block>
            </fo:table-cell>
            <fo:table-cell border="1pt solid black">
                <fo:block><xsl:value-of select="food"/></fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>
</xsl:stylesheet>

Это дает мне ошибку:

Not valid: org.apache.fop.fo.ValidationException: "fo:table-body" is missing child elements. Required content model: marker* (table-row+|table-cell+) (See position 1:975)

Я понимаю, что проблема в том, что часть apply-templates не оценивается.Но я не знаю, почему это происходит.Я пытался скопировать разные файлы, которые работали правильно и меняли имена элементов, но это не помогло.

1 Ответ

0 голосов
/ 01 июня 2019

Очевидно, ваше пространство имен по умолчанию

xmlns="zwierzeta"

не принято.Изменение его на префиксное пространство имен устраняет ваши проблемы.Поэтому измените его на

xmlns:zw="zwierzeta"

, а затем добавьте префикс ко всем элементам, которые зависят от пространства имен по умолчанию.Весь файл XSLT может выглядеть следующим образом:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:zw="zwierzeta" xmlns:a="anatomia">

    <xsl:template match="/zw:results">                     <!-- Prefixed -->
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="wzorzec1" page-width="210mm" page-height="297mm" margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
                    <fo:region-body margin="3cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="wzorzec1">
                <fo:flow flow-name="xsl-region-body" font-family="Arial">
                    <fo:block font-size="20" text-align="center">Raport</fo:block>
                    <fo:table border="1pt solid black" text-align="center" border-spacing="2pt">
                        <fo:table-header>
                            <fo:table-row>
                                <fo:table-cell border="1pt solid black"> <fo:block>Nazwa</fo:block> </fo:table-cell>
                                <fo:table-cell border="1pt solid black"> <fo:block>Status</fo:block> </fo:table-cell>
                                <fo:table-cell border="1pt solid black"> <fo:block>Odzywianie</fo:block> </fo:table-cell>
                            </fo:table-row>
                        </fo:table-header>
                        <fo:table-body>
                            <xsl:apply-templates select="zw:animal"/>
                        </fo:table-body>
                    </fo:table>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template match="zw:animal">                                    <!-- Prefixed -->
        <fo:table-row>
            <fo:table-cell border="1pt solid black">
                <fo:block><xsl:value-of select="zw:name"/></fo:block>   <!-- Prefixed -->
            </fo:table-cell>
            <fo:table-cell border="1pt solid black">
                <fo:block><xsl:value-of select="zw:status"/></fo:block> <!-- Prefixed -->
            </fo:table-cell>
            <fo:table-cell border="1pt solid black">
                <fo:block><xsl:value-of select="zw:food"/></fo:block>   <!-- Prefixed -->
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>
</xsl:stylesheet>
...