3

我有一行,其中一列有一个数据列表。假设我有一行,第三列有 0 行或更多行。<xsl:for-each select="./parts">由于某种原因,我的代码似乎不起作用。我不确定如何实现它。我收到此错误。

org.apache.fop.events.LoggingEventListener processEvent 以下功能尚未由 Apache FOP 实现:table-layout="auto" (on fo:table) (没有可用的上下文信息) [4/1/13 19: 14:38:002 CDT] 00000053 SystemErr R org.apache.fop.fo.ValidationException:“fo:table-cell”缺少子元素。所需的内容模型:marker* (%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>
4

4 回答 4

3

尝试删除严格的验证:

fopFactory.setStrictValidation(false);

于 2014-04-10T16:31:31.243 回答
3

好的,所以你得到的问题来自这个块。

<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-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 块来减轻逻辑中的变化。

最后一点,我在 else 语句中放入的块 contains ,它只是单个空格的编码。如果您希望您的“空”块仍然保留一行空间(即,如果没有文本内容,则阻止它折叠),您可以使用空白来防止块折叠,否则,如果您不关心它是否崩溃,只需删除空白即可。

于 2015-05-01T16:14:00.823 回答
1

如果您查看fo:table-cell 的 W3 XSL-FO 规范,您将看到

Contents:

(%block;)+

+ 表示“一个或多个”,即强制

并且 %block 实体由 W3定义如下

The parameter entity, "%block;" in the content models below, contains the following formatting objects:

     block
     block-container
     table-and-caption
     table
     list-block

所以 Navin Rawat 是对的,你需要确保你的牢房里有东西。

/ 科尔姆

于 2015-01-07T08:06:19.493 回答
1

有时您的代码似乎:

<xsl:for-each select="./parts">
   <fo:block font-size="8pt"><xsl:value-of select="partNumber" /><fo:leader />
    </fo:block>
 </xsl:for-each>

不返回任何东西。您需要将其放入变量中并检查它。如果没有值则置空以避免此错误。

于 2013-05-29T07:01:01.043 回答