XSLT - 将表结构转换为FO

时间:2011-09-01 15:41:14

标签: xslt xsl-fo

我想为INPUT创建转换以获得OUTPUT。我正在尝试各种转换,但它不起作用。我尝试将<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 个答案:

答案 0 :(得分:3)

从样本中找出如何为每个错误提供建议有点困难,因为我认为它与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循环的帮助,可以发布您尝试过的代码示例,但它不起作用。