1

我在尝试仅为一组相同的节点打印一行时遇到问题,但我找不到相同节点的类似帖子。

我有一个包含一组相同节点的输入 xml 文件,例如它看起来像:

<BookDetails>
<BK ISBN="123362367127" Shelf="Y" />
<BK ISBN="123362367127" Shelf="Y" />
<BK ISBN="123362367127" Shelf="Y" />
<BK ISBN="123362367127" Shelf="Y" />
</BookDetails>

我想要的是只打印一次这本书的信息。我认为我的问题的解决方案可能是 muenchian 分组,例如按 ISBN 值分组,然后从组中仅打印第一个。

基于此,我的代码如下所示:

<xsl:key name="UniqueBKs" match="BK" use="@ISBN"/> 

<xsl:template name="BookDetails">
  <fo:table width="160mm" table-layout="fixed">
    <fo:table-column column-width="80mm" column-number="1"/>
    <fo:table-column column-width="80mm" column-number="2"/>
        <fo:table-body>
            <xsl:for-each select="BK[generate-id() = generate-id(key('UniqueBKs', @ISBN)[1])]">      
                <fo:table-row>
                    <xsl:apply-templates select="."/>
                </fo:table-row>  
            </xsl:for-each>
        </fo:table-body>
   </fo:table>
</xsl:template>

和:

<xsl:template match="BK">
    <fo:table-cell>
        <fo:block font-family="arial" font-size="8pt" text-align="left">
            <xsl:text>ISBN:</xsl:text>
        </fo:block>        
    </fo:table-cell>
    <fo:table-cell>
        <fo:block font-family="arial" font-size="8pt" text-align="right">
            <xsl:value-of select="@ISBN"/> 
        </fo:block>
    </fo:table-cell>
</xsl:template>

如果我的输入 xml 文件仅包含一个 BK 元素,则代码可以正常工作。如果我有多个如上所示,Apache FOP 会返回一个与表格单元格相关的错误:“行中的列号或单元格数溢出为表格指定的 fo:table-columns 的数量。”

该错误表明我正在尝试在我的表格行中放置更多表格单元格,而:a)我希望此示例仅打印 1 行 b)在更多 ISBN 的情况下生成更多行,而不是更多表格单元格.

任何帮助将不胜感激,谢谢!

4

2 回答 2

0
    <xsl:for-each select="BK[1]">
        <xsl:value-of select".">
    </xsl:for-each>

将 [1] 添加到您使用的 for-each 选择的末尾将导致仅“打印”第一个匹配项。

于 2014-04-23T22:01:11.150 回答
0

真的是这样吗

<xsl:template name="BookDetails">

我认为应该是

<xsl:template match="BookDetails">

或者

<xsl:template name="BookDetails" match="BookDetails">
于 2014-04-24T03:03:12.283 回答