XSLT动态FO块创建

时间:2018-04-06 15:09:35

标签: xml xslt

我收到此错误:

  

XML解析器报告的错误:元素类型&#34; fo:table-row&#34;必须终止     通过匹配的结束标记&#34; library(tidyverse) valenz <- data.frame( mean = c(6, 0, 2, 4, 3, 5, 4, 5), group = c("group a","group a", "group b","group b", "group c","group c","group d","group d"), condition = c("condition1", "condition2","condition1", "condition2","condition1", "condition2","condition1", "condition2") ) ggplot (valenz, aes(x=group, y=mean, fill=factor(condition), alpha=group)) + geom_bar(stat="identity",position="dodge") &#34;。

尝试动态创建</fo:table-row>时。

这是我目前的XSLT代码:

fo:table-row

这就是我使用的XML(尽管我认为这是我的语法而不是实际的XML问题):

<xsl:template match="sec|ack">
    <xsl:call-template name="subtitle">
        <xsl:with-param name="text" select="title"/>
    </xsl:call-template>
        <fo:table width="100%">
            <fo:table-column column-width="45%"/>
            <fo:table-column column-width="45%"/>
            <fo:table-body>     
                <xsl:for-each select="sec/*">
                    <xsl:variable name="i" select="position()" />
                    <xsl:if test="($i == 1)">
                        <fo:table-row>
                    </xsl:if>
                    <xsl:if test="($i mod 2) && $i > 1">
                        </fo:table-row>
                        <fo:table-row>
                    </xsl:if>
                    <fo:table-cell>
                        <fo:block><xsl:value-of select="*" /></fo:block>
                    </fo:table-cell>
                </xsl:for-each>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
</xsl:template>

我将历史代码从1列显示转换为2列显示。如果有更好的非表格方法,我也会对此感兴趣。我尝试使用<sec> <title>Section Title</title> <sec> <title>Paragraph 1 Title</title> <p>Body paragraph</p> </sec> <sec> <title>Paragraph 2 Title</title> <list list-type="order"> <list-item> <p>Step 1.</p> </list-item> <list-item> <p>Step 2.</p> </list-item> <list-item> <p>Step 3.</p> </list-item> <list-item> <p>Step 4.</p> </list-item> <list-item> <p>Step 5.</p> </list-item> <list-item> <p>Step 6.</p> </list-item> <list-item> <p>Step 7.</p> </list-item> <list-item> <p>Step 8.</p> </list-item> <list-item> <p>Step 9.</p> </list-item> <list-item> <p>Step 10.</p> </list-item> <list-item> <p>Step 11.</p> </list-item> <list-item> <p>Step 12.</p> </list-item> <list-item> <p>Step 13.</p> </list-item> <list-item> <p>Step 14.</p> </list-item> </list> </sec> </sec> 但无法使其正常运行。通过这种方法,我可以使静态2列显示工作。

这是我的静态方法:

float

1 个答案:

答案 0 :(得分:2)

当您指示使用XSLT 2时,您可以使用for-each-group group-adjacent="(position() - 1) idiv 2"的位置分组将每两个选定的相邻节点分组为一个表行,而不是您使用的<xsl:for-each select="sec/*">

<xsl:for-each-group select="*" group-adjacent="(position() - 1) idiv 2">
    <fo:table-row>
        <xsl:apply-templates select="current-group()" mode="cell"/>
    </fo:table-row>
</xsl:for-each-group>

然后编写一个模板,将任何元素转换为该命名模式的单元格:

<xsl:template match="*" mode="cell">
    <fo:table-cell>
        <fo:block>
          <xsl:apply-templates/>
        </fo:block>
    </fo:table-cell>
</xsl:template>