使用FOP导出PDF时出错" fo:list-item"不是" fo:list-item-body"的有效孩子!

时间:2015-09-01 14:25:02

标签: java xml apache xsl-fo apache-fop

尝试使用fop导出PDF时出现错误:

严重:例外 org.apache.fop.apps.FOPException:org.apache.fop.fo.ValidationException:" fo:list-item"不是" fo:list-item-body"的有效孩子! (没有上下文信息) javax.xml.transform.TransformerException:org.apache.fop.fo.ValidationException:" fo:list-item"不是" fo:list-item-body"的有效孩子! (没有上下文信息)

从我可以告诉我们的XSL看起来应该运行。这是XSL的摘录。



 <xsl:template match="ol" mode="section-body">
    <fo:list-block keep-together="always">
    <fo:list-item>
        <fo:list-item-label>
        </fo:list-item-label>
        <fo:list-item-body>
        <xsl:apply-templates select="li" mode="section-body" />
        </fo:list-item-body> 
    </fo:list-item>      
    </fo:list-block>
  </xsl:template>

  <xsl:template match="ul" mode="section-body">
    <fo:list-block provisional-distance-between-starts="40mm" content-width="2.5in">
    <fo:list-item>
            <fo:list-item-label>
            </fo:list-item-label>
            <fo:list-item-body>
                <xsl:apply-templates select="li" mode="section-body"/>
            </fo:list-item-body>
    </fo:list-item> 
    </fo:list-block>
  </xsl:template>

  <xsl:template match="li" mode="section-body">
    <xsl:element name="fo:list-item">
      
      <xsl:if test="position() = last()">
        
      </xsl:if>
      <fo:list-item-label>
        <xsl:choose>
          <xsl:when test="parent::ol">
            <xsl:element name="fo:block" use-attribute-sets="list-marker-number"><xsl:value-of select="concat(position(),'.')" /></xsl:element>
          </xsl:when>
          <xsl:otherwise>
            <xsl:element name="fo:block" use-attribute-sets="list-marker">•</xsl:element>
          </xsl:otherwise>
        </xsl:choose>
      </fo:list-item-label>
      <fo:list-item-body>
        <xsl:choose>
          <xsl:when test="parent::ol">
            <xsl:element name="fo:block" use-attribute-sets="list-item-number">
              <xsl:apply-templates mode="section-body"/>
            </xsl:element>
          </xsl:when>
          <xsl:otherwise>
            <xsl:element name="fo:block">
              <xsl:apply-templates mode="section-body"/>
            </xsl:element>
          </xsl:otherwise>
        </xsl:choose>
      </fo:list-item-body>
    </xsl:element>
  </xsl:template>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:2)

olul的模板都会生成:

<fo:list-block keep-together="always">
<fo:list-item>
    <fo:list-item-label>
    </fo:list-item-label>
    <fo:list-item-body>
    <-- Result of processing <li> goes here! -->
    </fo:list-item-body> 
</fo:list-item>      
</fo:list-block>

并且每个li生成一个fo:list-item,其中包含fo:list-item-labelfo:list-item-body

如果您从fo:list-itemfo:list-item-label模板中移除fo:list-item-bodyolul

<xsl:template match="ol" mode="section-body">
  <fo:list-block keep-together="always">
      <xsl:apply-templates select="li" mode="section-body" />
  </fo:list-block>
</xsl:template>

<xsl:template match="ul" mode="section-body">
  <fo:list-block provisional-distance-between-starts="40mm" content-width="2.5in">
            <xsl:apply-templates select="li" mode="section-body"/>
  </fo:list-block>
</xsl:template>

然后您不会在fo:list-item内生成fo:list-item-body

如果您想尝试在FOP之外验证您的FO,那么我建议https://github.com/AntennaHouse/focheck

focheck