XSLT - 从一组相同的节点打印第一个节点

时间:2014-04-23 18:13:03

标签: xml xslt muenchian-grouping node-set

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

我有一个包含一组相同节点的输入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会返回与table-cells相关的错误: &#34;行中的列号或单元格数溢出了为表指定的fo:table-columns的数量。&#34;

错误表明我正在尝试在表格行中放入更多表格单元格,而: a)我希望这个例子只打印一行 b)如果有更多的ISBN,则需要生成更多的行,而不是更多的表格单元格。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

真的是

<xsl:template name="BookDetails">

我认为应该是

<xsl:template match="BookDetails">

<xsl:template name="BookDetails" match="BookDetails">