本文介绍了错误导出带FOP&QUOT PDF,FO:列表项"不是&QUOT有效的小孩; FO:列表项,身体QUOT;!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正试图用出口FOP一个PDF文件时收到一个错误:

重度:异常
org.apache.fop.apps.FOPException:org.apache.fop.fo.ValidationException:FO:列表项不是FO:列表项体的有效孩子! (无上下文信息)
javax.xml.transform.TransformerException中:org.apache.fop.fo.ValidationException:FO:列表项不是FO:列表项体的有效孩子! (无上下文信息可用)

从我可以告诉我们的XSL看起来像它应该运行。下面是来自XSL的摘录。

\r
\r

<的xsl:模板匹配=OL模式=一节体 >\r
    < FO:单块保持在一起=总是>\r
    < FO:列表项>\r
        < FO:列表项,标签>\r
        < / FO:列表项,标签>\r
        < FO:列表项体>\r
        < XSL:申请模板选择=礼模式=一节体/>\r
        < / FO:列表项体>\r
    < / FO:列表项>\r
    < / FO:单块>\r
  < / XSL:模板>\r
\r
  <的xsl:模板匹配=UL模式=一节体>\r
    < FO:单块临时距离之间-开始=40毫米内容宽度=2.5英寸>\r
    < FO:列表项>\r
            < FO:列表项,标签>\r
            < / FO:列表项,标签>\r
            < FO:列表项体>\r
                < XSL:申请模板选择=礼模式=一节体/>\r
            < / FO:列表项体>\r
    < / FO:列表项>\r
    < / FO:单块>\r
  < / XSL:模板>\r
\r
  <的xsl:模板匹配=礼模式=一节体>\r
    < XSL:元素名称=FO:列表项>\r
      \r
      <的xsl:if测试=位置()=上()>\r
        \r
      < / XSL:如果>\r
      < FO:列表项,标签>\r
        < XSL:选择>\r
          <的xsl:when测试=父:: OL>\r
            < XSL:元素名称=FO:块使用属性集=列表的标记号>< XSL:选择=CONCAT('。'位置())/&GT值的;< / XSL:组件>\r
          < / XSL:当>\r
          <的xsl:否则>\r
            < XSL:元素名称=FO:块使用属性集=列表的标记>&•LT / XSL:组件>\r
          < / XSL:否则>\r
        < / XSL:选择>\r
      < / FO:列表项,标签>\r
      < FO:列表项体>\r
        < XSL:选择>\r
          <的xsl:when测试=父:: OL>\r
            < XSL:元素名称=FO:块使用属性集=列表项数>\r
              < XSL:申请模板模式=一节体/>\r
            < / XSL:组件>\r
          < / XSL:当>\r
          <的xsl:否则>\r
            < XSL:元素名称=FO:块>\r
              < XSL:申请模板模式=一节体/>\r
            < / XSL:组件>\r
          < / XSL:否则>\r
        < / XSL:选择>\r
      < / FO:列表项体>\r
    < / XSL:组件>\r
  < / XSL:模板>

\r

\r
\r


解决方案

您的模板 UL 这两个产生:

 < FO:单块保持在一起=总是>
< FO:列表项>
    < FO:列表项,标签>
    < / FO:列表项,标签>
    < FO:列表项体>
    < - 加工 - LT的结果;李>去这里! - >
    < / FO:列表项体>
< / FO:列表项>
< / FO:单块>

和每生成一个 FO:包含列表项 FO:列表项标签 FO:列表项体

如果您删除 FO:列表项 FO:列表项标签 FO:列表项体 UL 模板

 <的xsl:模板匹配=OL模式=一节体>
  < FO:单块保持在一起=总是>
      < XSL:申请模板选择=礼模式=一节体/>
  < / FO:单块>
< / XSL:模板><的xsl:模板匹配=UL模式=一节体>
  < FO:单块临时距离之间-开始=40毫米内容宽度=2.5英寸>
            < XSL:申请模板选择=礼模式=一节体/>
  < / FO:单块>
< / XSL:模板>

那么你就不会产生 FO:列表项内的 FO:列表项体

如果你想尝试验证您FO FOP之外,那么我建议的 focheck 是在

We're getting an error when trying to export a PDF with fop:

SEVERE: Exceptionorg.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "fo:list-item" is not a valid child of "fo:list-item-body"! (No context info available)javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "fo:list-item" is not a valid child of "fo:list-item-body"! (No context info available)

From what I can tell our XSL looks like it should run. Here's an excerpt from the 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>

解决方案

Your templates for ol and ul both generate:

<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>

and each li generates an fo:list-item that contains an fo:list-item-label and an fo:list-item-body.

If you remove the fo:list-item, fo:list-item-label, and fo:list-item-body from your ol and ul templates:

<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>

then you won't be generating an fo:list-item inside an fo:list-item-body.

If you want to try validating your FO outside of FOP, then I suggest focheck at https://github.com/AntennaHouse/focheck

这篇关于错误导出带FOP&QUOT PDF,FO:列表项&QUOT;不是&QUOT有效的小孩; FO:列表项,身体QUOT;!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-30 04:09