XSLT - преобразовать структуру таблицы в FO - PullRequest
3 голосов
/ 01 сентября 2011

Я хотел бы создать преобразование для ВХОДА, чтобы получить ВЫХОД. Я пробовал разные трансформации, но это не сработало. Я попытался поместить <xsl:for-each> между <fo:table-body> и <fo:table-row> элементами, но я получил ошибку, что дочерний элемент отсутствует (это был <fo:table-row>). Любая помощь будет оценена.

INPUT

<table>
<tgroup>
    <thead>
        <row>
            <entry>A</entry>
            <entry>B</entry>
        </row>
    </thead>
    <tbody>
        <row>
            <entry>a1</entry>
            <entry>a2</entry>
        </row>
        <row>
            <entry>b1</entry>
            <entry>b2</entry>
        </row>
    </tbody>
</tgroup>
</table>

OUTPUT

<fo:table>
    <fo:table-body>
        <fo:table-row font-weight="bold">
            <fo:table-cell>
                <fo:block>A</fo:block>
            </fo:table-cell>
            <fo:table-cell>
                <fo:block>B</fo:block>
            </fo:table-cell>
        </fo:table-row>
        <fo:table-row>
            <fo:table-cell>
                <fo:block>a1</fo:block>
            </fo:table-cell>
            <fo:table-cell>
                <fo:block>a2</fo:block>
            </fo:table-cell>
        </fo:table-row>
        <fo:table-row>
            <fo:table-cell>
                <fo:block>b1</fo:block>
            </fo:table-cell>
            <fo:table-cell>
                <fo:block>b2</fo:block>
            </fo:table-cell>
        </fo:table-row>
    </fo:table-body>
</fo:table>

1 Ответ

3 голосов
/ 01 сентября 2011

Из примера немного сложно выяснить, как давать советы по каждой ошибке, потому что я думаю, что она связана с xpath и на нее нет ссылок.

Вот альтернативное решение, вместо этого используйте apply-templates. (а также я думаю, что в этом случае лучше использовать apply-templates, чем for-each):

<xsl:template match="table">
    <fo:table>
        <fo:table-body>
            <xsl:apply-templates select="tgroup/*/row"/>
        </fo:table-body>
    </fo:table>
</xsl:template>

<xsl:template match="thead/row">
    <fo:table-row font-weight="bold">
        <xsl:apply-templates select="entry" />
    </fo:table-row>
</xsl:template>

<xsl:template match="tbody/row">
    <fo:table-row>
        <xsl:apply-templates select="entry" />
    </fo:table-row>
</xsl:template>

<xsl:template match="entry">
    <fo:table-cell>
        <fo:block><xsl:value-of select="."/></fo:block>
    </fo:table-cell>
</xsl:template>

Надеюсь, это поможет.

P.S. Если вам нужна помощь с циклом for-each, можете ли вы опубликовать пример кода, который вы пытались и он не работал.

...