首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让xsl:fo允许表单元格接受空块并打印多行

如何让xsl:fo允许表单元格接受空块并打印多行
EN

Stack Overflow用户
提问于 2013-04-02 00:32:42
回答 4查看 9.4K关注 0票数 3

我有一行,其中一列有一个数据列表。假设我有一行,第三列有0或更多行。<xsl:for-each select="./parts">,由于某些原因,我的代码似乎不起作用。我不知道如何实施。我得到了这个错误。

org.apache.fop.events.LoggingEventListener processEvent 4/1/13 19:14:38:002 CDT 00000053 SystemErr R org.apache.fop.fo.ValidationException:"fo:table-cell“缺少子元素。必需的内容模型:标记*(%块;)+(没有上下文信息)

我有这段代码,但这不起作用。

代码语言:javascript
复制
<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>
EN

回答 4

Stack Overflow用户

发布于 2014-04-10 16:31:31

尝试删除严格的验证:

fopFactory.setStrictValidation(false);

票数 3
EN

Stack Overflow用户

发布于 2015-05-01 16:14:00

好吧,所以你遇到的问题来自这个街区。

代码语言:javascript
复制
<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个部件元素,那么您的表单元格就没有块子元素。在我看来,有两个简单的解决办法。首先,尝试将for-每个语句包装在另一个块元素中,如下所示。

代码语言:javascript
复制
<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: see语句,在尝试迭代它们之前测试它是否至少有一个部分,否则它会插入一个空块。

代码语言:javascript
复制
<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>

虽然这样做更长,但它也更可扩展,例如,如果在将来的某个点,如果有数据,您希望它显示部件列表,如果不显示另一个值(可能也可能存在,也可能不存在),则可以简单地添加另一个which块,以减轻逻辑中的更改。

最后一个注意事项是,我在One语句中放置的块包含space,它只是单个空白的编码。如果您希望“空”块仍保留一行空间(即如果没有文本内容,则停止折叠),则可以使用空白来防止块折叠,否则,如果您不关心它是否折叠,只需删除空白即可。

票数 3
EN

Stack Overflow用户

发布于 2013-05-29 07:01:01

有时候,您的代码:

代码语言:javascript
复制
<xsl:for-each select="./parts">
   <fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader />
    </fo:block>
 </xsl:for-each>

不会归还任何东西。您需要将它放入一个变量并检查它。如果没有值,则放置为空以避免此错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15754193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档