2011-07-12 118 views
1

這是博客文章的類別索引 - 我只想使用xsl v1.0顯示一次類別。每個類別都會有多個帖子。期望的結果是:獲取xsl 1.0只顯示列表中的第一個項目

Cat Name 1 
cat Name 2 
Cat Name 3 

我假設分組的項目,只顯示一組中的第一個(使用cat名作爲鍵)會工作,但Muenchian方法有點超出了我的能力。因此,對Muenchian方法的更簡單的方法或簡單的解釋將是非常值得讚賞的。

的XML

<Root> 
<Schema> 
<Field Type="Lookup" DisplayName="Category name" Required="FALSE" ShowField="Category_x0020_name" Name="Category_x0020_name" Group="" /> 
<Field ReadOnly="TRUE" Type="Computed" Name="LinkTitle" DisplayName="Post number" /> 
</Schema> 
<Data ItemCount="1"> 
<Row Category_x0020_name="" LinkTitle="" /> 
</Data> 
</Root> 

了xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" />  
    <xsl:template match="/"> 
    <table border="0" cellpadding="0" cellspacing="0">  
<h3>Categories</h3> 
<xsl:for-each select="//Data/Row"> 
       <xsl:if test="./@Category_x0020_name !=''"> 
<tr valign="top">   <td>    
<a href="/cat{./@LinkTitle}.aspx"> 
<xsl:value-of select="./@Category_x0020_name" /></a></td> </tr> 
</xsl:if> 
</xsl:for-each> 
</table> 
</xsl:template> 
</xsl:stylesheet> 

回答

4

不要害怕Meunchian方法。使用它一次,你可以在需要的時候使用它。

  • 收集有用數據組中的一個關鍵
  • 使用謂詞相同的密鑰應用模板只有一個節點像

這就是你需要知道的東西使用Meunchian分組。在這裏爲您開始:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="Cat" match="Data/Row" use="@Category_x0020_name"/> 

    <xsl:template match="/*/Data"> 
     <xsl:apply-templates select="Row 
      [generate-id() 
      = generate-id(key('Cat',@Category_x0020_name)[1])]"/> 
    </xsl:template> 

    <xsl:template match="Row"> 
     <xsl:value-of select="concat(@Category_x0020_name,'&#xA;')"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

+1很好的答案。這可能成爲XSLT的座右銘:「不要害怕Meunchian方法」。 :-) – LarsH

+1

@ empo - 基於你的回答,我將克服對Muenchian方法的恐懼。我有一個這個項目的最後期限,但會回發,如果我得到它的排序。感謝您的輸入。 – matt

+0

@LarsH謝謝,您的欣賞真的很受歡迎。 –

1

既然你不需要列出每個類別的成員,並假設你的數據集不是非常大,這樣的表現並不一個很重要的因素,你可以放棄Muenchian組合,尋找不太優雅的東西。只要改變你的<xsl:if test>到:

 <xsl:if test="./@Category_x0020_name !='' and 
      not(./@Category_x0020_name = preceding::Row/@Category_x0020_name)"> 

換句話說,只能輸出一個類別名稱它發生在第一時間。

順便提一句,您可以在XPath表達式的開始處移除./。這是多餘的。它意味着「從上下文節點開始」,但您已經從上下文節點開始。如果你想爲了可讀性或其他目的而放置它,沒關係。

然後輸入像

<Root>... 
    <Data ItemCount="1"> 
     <Row Category_x0020_name="foo" LinkTitle="Foo" /> 
     <Row Category_x0020_name="bar" LinkTitle="Bar" /> 
     <Row Category_x0020_name="foo" LinkTitle="Foo" /> 
    </Data> 
</Root> 

你得到這樣的輸出:

<table border="0" cellpadding="0" cellspacing="0"> 
    <h3>Categories</h3> 
    <tr valign="top"> 
     <td><a href="/catFoo.aspx">foo</a></td> 
    </tr> 
    <tr valign="top"> 
     <td><a href="/catBar.aspx">bar</a></td> 
    </tr> 
</table> 
+0

@ LarsH-這些列表非常小,而且這個功能非常完美。謝謝。 – matt

相關問題