Получить XSL 1.0, чтобы показать только первый элемент в группе в списке - PullRequest
1 голос
/ 12 июля 2011

Это для индекса категории сообщений в блоге - я хочу показать категорию только один раз, используя xsl v1.0.В каждой категории будет несколько постов.Желаемый результат:

Cat Name 1
cat Name 2
Cat Name 3 

Я предполагаю, что сгруппировать элементы и будет показывать только первый элемент в группе (используя имя кошки в качестве ключа), но метод Мюнхена немного выходит за рамки моих возможностей.Так что более ценный метод или простое объяснение метода Мюнхена было бы наиболее ценно.

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> 

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Не бойся меунского метода. Используйте его один раз, и вы сможете применять его в любое время.

  • собрать нужные данные для группировки в ключе
  • применить шаблоны к только одному узлу с тем же ключом , используя предикат типа

generate-id()=generate-id(key(...)[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>
1 голос
/ 12 июля 2011

Так как вам не нужно перечислять членов каждой категории, и если ваши наборы данных не очень велики, а производительность не является существенным фактором, вы можете отказаться от группировки Мюнхена для чего-то немного менее элегантного. Просто измените ваш <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...