2011-07-12 15 views
1

これはブログ投稿のカテゴリインデックスです.xsl v1.0を使用して一度だけカテゴリを表示したいだけです。各カテゴリに複数の投稿があります。望ましい結果は次のとおりです。リスト内のグループ内の最初の項目のみを表示するようにxsl 1.0を取得する

Cat Name 1 
cat Name 2 
Cat Name 3 

私はアイテムをグループ化し、のみ(キーとして猫の名前を使用して)、グループ内の最初のものは動作しますが、表示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方法を恐れてはいけません。一度だけ使用すると、必要なときにいつでも適用することができます。

  • キー
  • にあなたが知っている必要なものです

のような述語を使用して同じキーで1つのノードにのみテンプレートを適用するグループしたいデータを収集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

あなたが各カテゴリのメンバーをリストする必要があり、パフォーマンスではありませんので、あなたのデータセットが非常に大きくないと仮定していないので、大きな要因は、あなたはMuencianのグループ化を少しエレガントなものよりも先にすることができます。

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

言い換えれば、出力のみカテゴリはそれが初めて発生したときに名前:ちょうどあなたの<xsl:if test>に変更。

なお、./は、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