gpt4 book ai didi

xml - xsl-fo,org.apache.fop.fo.ValidationException : "fo:table-body" is missing child elements

转载 作者:行者123 更新时间:2023-12-04 04:38:22 29 4
gpt4 key购买 nike

我有一个 XML 输入文件,可以说 shipnote.xml其中包含一个零件项目列表。部分项目具有通常的属性 qty , partnolabel .每个项目都分配给一个 packetno .

我写了一个 xsl 文件来从这些数据生成一个 pdf-shipnote。要求是,每个 packetno应从 pdf 文档中的新页面开始。每页最多有 5 个项目。

我试图做的是,首先选择不同的PCKNO s 并循环遍历这个不同的 packetno s。然后我在第一个循环中嵌入了第二个循环来检索每个 PCKNO 的文章。 , 将它们打印在发货单上。

您可以在下面看到 ship.xml 中的示例数据:

root>
items>

item PCKNO="1" PCKCNT="2" > QTY>2/QTY> PARTNO>1518/PARTNO> LABEL>Part12/LABEL> /item>
item PCKNO="1" PCKCNT="2" > QTY>1/QTY> PARTNO>1519/PARTNO> LABEL>Partxy/LABEL> /item>
item PCKNO="2" PCKCNT="2" > QTY>3/QTY> PARTNO>1518/PARTNO> LABEL>Part12/LABEL> /item>
item PCKNO="2" PCKCNT="2" > QTY>2/QTY> PARTNO>1519/PARTNO> LABEL>Partxy/LABEL> /item>

/items>

/root>

此布局是必需的:
pdf-Page 1, <b>PCKNO:</b> 1
qty | Partno | Label |
----|--------|----------|
2 | 1518 | Part123 |
1 | 1519 | Partxyz |

pdf-Page 2, <b>PCKNO:</b> 2
qty | Partno | Label |
----|--------|----------|
3 | 1518 | Part123 |
2 | 1520 | Partfour |

然后我应用了 xsl-stylesheet 来满足要求。

外循环是通过以下方式完成的:
fo:table table-layout='fixed' width="100%" >
!-- Columns of shipnote-->
fo:table-column />
fo:table-column />
fo:table-column />
fo:table-header >
fo:table-row >
fo:table-cell><fo:block font-weight="bold">Qty /fo:block> /fo:table-cell>
fo:table-cell><fo:block font-weight="bold">Partno. /fo:block> /fo:table-cell>
fo:table-cell><fo:block font-weight="bold">Partname /fo:block> /fo:table-cell>
/fo:table-row >
/fo:table-header>

fo:table-body>

!-- outer Loop get distinct pckno-->
xsl:for-each select="items/item[not(@PCKNO=preceding-sibling::position/@PCKNO)]/@PCKNO"
xsl:variable name="packno" select="."/>
!-- inner loop get items per pckno-->
xsl:for-each select="items/item[@PCKNO = $packno]" >

fo:table-row keep-together="always">
!-- paximum of 5 parts per page-->
xsl:if test="position() mod 5 = 1">
xsl:attribute name="break-before">page/xsl:attribute>
/xsl:if>
fo:table-cell>fo:block> xsl:value-of select="QTY"/> /fo:block> /fo:table-cell>
fo:table-cell>fo:block> xsl:value-of select="PARTNO"/> /fo:block> /fo:table-cell>
fo:table-cell>fo:block> xsl:value-of select="LABEL"/> /fo:block> /fo:table-cell>
/fo:table-row>

/xsl:for-each>

/xsl:for-each>

我正在使用这个 fop 命令: fop -xsl shiptest.xsl -xml shiptest.xml -pdf shiptest.pdf
结果是:
     Exception

- org.apache.fop.apps.FOPException: <b>org.apache.fop.fo.ValidationException: "fo:table-body" is missing child elements. </b>Required content model: marker* (table-row+|table-cell+) (no contextinfo available)

- javax.xml.transform.TransformerException: <b>org.apache.fop.fo.ValidationException: "fo:table-body" is missing child elements. </b>Required content model: marker* (table-row+|table-cell+) (no contextinfo available)

当我剥离外循环并仅使用具有常量参数 1、2 的内循环时,它会按需要工作:
  xsl:for-each select="items/item[@PCKNO = <b>1</b>]"   /xsl:for-each
xsl:for-each select="items/item[@PCKNO = <b>2</b>]" /xsl:for-each

但我需要它动态。我被困在这一点上。请给我一个提示如何解决这个问题。

最佳答案

这是 xsl:for-each 你有问题....

<xsl:for-each select="items/item[not(@PCKNO=preceding-sibling::position/@PCKNO)]/@PCKNO">

这有两个问题...
  • 你在做什么preceding-sibling::position ,但没有元素名称 职位在您的 XML 中。
  • 您正在选择 @PCKNO 您的 中的属性xsl:for-each 意内 xsl:for-each 将相对于该属性。但你的内心 xsl:for-each 正在选择 件/件 ,所以它不会选择任何东西。

  • 因此,“最简单”的修复方法是更改​​第一个 xsl:for-each 对此
    <xsl:for-each select="items/item[not(@PCKNO=preceding-sibling::item/@PCKNO)]">

    因此,此时您位于 项目 元素。因此,您需要更改内部 xsl:for-each 到这个,所以它回到父元素,然后可以选择所有 项目 相同的元素 @PCKNO 属性。
    <xsl:for-each select="../item[@PCKNO = $packno]">

    值得注意的是使用 前辈不是寻找不同元素的特别有效的方法。在 XLST 1.0 中,最有效的分组方式是使用一种称为 Muenchian Grouping 的技术。 .或者,如果您能够使用 XSLT 2.0,您可以使用 xsl:for-each-group .

    关于xml - xsl-fo,org.apache.fop.fo.ValidationException : "fo:table-body" is missing child elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19334802/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com