2014-04-23 107 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"> 
相關問題