Html 如何让xsl:fo允许表单元格获取空块并打印多行

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

我有一行,其中一列有一个数据列表。假设我有一行,第三列有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;)+(无上下文信息可用)

我有这个代码,但它不起作用

<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) &gt; 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>&#160;</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) &gt; 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>&#160;</fo:block>
</xsl:otherwise>
</xsl:choose>
  </fo:table-cell>