Html 如何让xsl:fo允许表单元格获取空块并打印多行
我有一行,其中一列有一个数据列表。假设我有一行,第三列有0行或更多行<代码>由于某种原因,我的代码似乎不起作用。我不知道如何实施它。我得到了这个错误 org.apache.fop.events.LoggingEventListener进程事件 ApacheFop还没有实现该特性:tablelayout=“auto”(on fo:表格(无上下文信息可用)[4/1/13 19:14:38:002 CDT] 00000053 SystemErr R org.apache.fop.fo.ValidationException: “fo:表格单元格”缺少子元素。所需内容模型: 标记*(%block;)+(无上下文信息可用) 我有这个代码,但它不起作用Html 如何让xsl:fo允许表单元格获取空块并打印多行,html,xml,xslt,xsl-fo,apache-fop,Html,Xml,Xslt,Xsl Fo,Apache Fop,我有一行,其中一列有一个数据列表。假设我有一行,第三列有0行或更多行由于某种原因,我的代码似乎不起作用。我不知道如何实施它。我得到了这个错误 org.apache.fop.events.LoggingEventListener进程事件 ApacheFop还没有实现该特性:tablelayout=“auto”(on fo:表格(无上下文信息可用)[4/1/13 19:14:38:002 CDT] 00000053 SystemErr R org.apache.fop.fo.ValidationEx
<xsl:for-each select="./List">
<fo:table-row>
<fo:table-cell border="solid 1px" text-align="center">
<fo:block font-size="8pt"><xsl:value-of select="group" /></fo:block>
<fo:table-cell>
<fo:table-cell border="solid 1px" text-align="left">
<xsl:for-each select="./parts">
<fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader />
</fo:block>
</xsl:for-each>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
有时您的代码似乎:
<xsl:for-each select="./parts">
<fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader />
</fo:block>
</xsl:for-each>
不返回任何内容。您需要将其放入一个变量并进行检查。如果没有值,请将其置为空以避免此错误。尝试删除严格验证:
fopFactory.setStritValidation(假)代码>如果查看W3 XSL-FO,您将看到
Contents:
(%block;)+
+表示“一个或多个”,即强制性
而%block实体是由W3生成的
纳文·拉瓦特是对的,你需要确保你的牢房里有东西
/Colm好的,所以您遇到的问题来自此块
<fo:table-cell border="solid 1px" text-align="left">
<xsl:for-each select="./parts">
<fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader />
</fo:block>
</xsl:for-each>
</fo:table-cell>
正如我相信其他人已经指出的,如果您有0个parts元素,那么您的表单元格就没有块子元素。在我看来,有两个简单的解决办法。首先,尝试将for-each语句包装到另一个块元素中,如下所示
<fo:table-cell border="solid 1px" text-align="left">
<fo:block>
<xsl:for-each select="./parts">
<fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader />
</fo:block>
</xsl:for-each>
<fo:block>
</fo:table-cell>
如果发现它对格式有不必要的影响,则可以使用填充和其他属性,以便添加的块仍保持对齐。这肯定会解决您的问题。一个稍微复杂一点的替代方法是使用xsl:choose语句,在尝试迭代之前测试是否至少有一个部分,否则它将插入一个空块
<fo:table-cell border="solid 1px" text-align="left">
<xsl:choose>
<xsl:when test="count(./parts) > 0">
<xsl:for-each select="./parts">
<fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader />
</fo:block>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<fo:block> </fo:block>
</xsl:otherwise>
</xsl:choose>
</fo:table-cell>
虽然这更长,但它也更具可扩展性,例如,如果在未来某个时间点,您希望它在有数据时显示零件列表,并且如果不显示另一个值(也可能存在,也可能不存在),您可以简单地添加另一个when块以减轻逻辑中的更改
最后一个注意事项是,我放在otherwise语句中的块包含,它只是一个空格的编码。如果您希望“空”块仍保留一行空格(即,如果没有文本内容,则阻止其折叠),您可以使用空白防止块折叠,否则,如果您不关心块是否折叠,只需删除空白。请同时发布xml,以便在FOP CLI中的-r
标志上测试xslt。
<fo:table-cell border="solid 1px" text-align="left">
<xsl:choose>
<xsl:when test="count(./parts) > 0">
<xsl:for-each select="./parts">
<fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader />
</fo:block>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<fo:block> </fo:block>
</xsl:otherwise>
</xsl:choose>
</fo:table-cell>