2014-04-23 87 views
1

我面临一个问题,试图只为一组相同的节点打印一行,并且找不到相同节点的类似帖子。XSLT - 从一组相同的节点打印第一个节点

我有一个包含了一组相同的节点的输入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:表格列数量。

的错误表明我试图把更多的表格单元格在我的表行,而: 一)我预计只有1行要打印在这个例子中 B)中的更多的案例将产生更多的行国际标准书号,不是更多的表格单元

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

+0

如何生成的XML是什么样子?它的表格中每行只有两个单元格吗? – Tomalak

+0

你的意思是我想要生成的表格行?我正在尝试生成pdf,但现在它每行只有2个单元格。 – jeevana

+0

嗯,那么它看起来更像是一个FOP问题,而不是XSLT问题。至少从我的角度来看,你的XSLT看起来不错;该表格每行不应该有两个以上的单元格。 – Tomalak

回答

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

将[1]添加到for-each选项的结尾处将导致刚刚打印的第一个匹配项。

+0

谢谢,我会记住,还没有尝试过。 – jeevana

0

是真的

<xsl:template name="BookDetails"> 

我觉得应该是

<xsl:template match="BookDetails"> 

<xsl:template name="BookDetails" match="BookDetails"> 
相关问题