2011-07-12 76 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

相关问题