【问题标题】:XSL group and sort with specific item on topXSL 对特定项目进行分组和排序
【发布时间】:2018-02-27 03:29:55
【问题描述】:

下面我有一个包含事件列表的 XML 文件。 我想要实现的是按城市对它们进行分组,而纽约总是位居榜首。 其他城市应该按名称排序,然后按日期排序事件。 除了对其他城市进行排序之外,我可以做到所有这些(通过一些技巧)。

<Events>
  <Event id="1">
    <Title>Concert1</Title>
    <Date>2017-01-05 12:00</Date>
    <City>Seattle</City>
  </Event>
  <Event id="2">
    <Title>Concert2</Title>    
    <Date>2017-01-05 11:00</Date>
    <City>Los Angeles</City>
  </Event>
  <Event id="3">
    <Title>Concert3</Title>    
    <Date>2017-01-05 14:00</Date>
    <City>New York</City>
  </Event>
  <Event id="4">
    <Title>Concert4</Title>    
    <Date>2017-01-05 19:00</Date>
    <City>Austin</City>
  </Event>
    <Event id="5">
    <Title>Concert5</Title>    
    <Date>2017-01-05 15:00</Date>
    <City>New York</City>
  </Event>
  <Event id="6">
    <Title>Concert6</Title>    
    <Date>2017-01-05 12:00</Date>
    <City>Austin</City>
  </Event>
</Events>

还有一个 XLS (1.0) 文件,它使用 muenchian 分组按城市对事件进行分组。 另外为了将纽约提取到列表的顶部,我制作了 2 个单独的 for-each 循环:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>

<xsl:key name="groups" match="City" use="."/>

<xsl:template match="/Events">
  <xsl:apply-templates select="Event/City[generate-id() = generate-id(key('groups', .)[1])]"/>
</xsl:template>
<!-- NEW YORK -->
<xsl:template match="City[text()='New York']">
  <xsl:variable name="currentGroup" select="."/> 
  <b><xsl:value-of select="$currentGroup"/></b><br/>
  <xsl:for-each select="key('groups', $currentGroup)">
  <xsl:sort select="../Date"/>  
  <i>+ <xsl:value-of select="../Date"/> <xsl:value-of select="../Title"/></i><br/>  
  </xsl:for-each>  
</xsl:template>
<!-- OTHER CITIES -->
<xsl:template match="City[text()!='New York']">
  <xsl:variable name="currentGroup" select="."/> 
  <b><xsl:value-of select="$currentGroup"/></b><br/>
  <xsl:for-each select="key('groups', $currentGroup)">
  <xsl:sort select="../Date"/>  
  <i>+ <xsl:value-of select="../Date"/> <xsl:value-of select="../Title"/></i><br/>  
  </xsl:for-each>  
</xsl:template>

</xsl:stylesheet>

目前“其他城市”处于输入顺序。如何在 XML 之上进行分组和排序,以便 HTML 结果如下所示:

New York 
+ 14:00 Concert3 
+ 15:00 Concert5
Austin
+ 12:00 Concert6
+ 19:00 Concert4
Los Angeles
+ 11:00 Concert2
Seattle
+ 12:00 Concert1

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    我不确定为什么您发布的代码会首先输出“纽约”事件,但它应该很容易

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="UTF-8" indent="yes"/>
    
    <xsl:key name="groups" match="City" use="."/>
    
    <xsl:template match="/Events">
      <xsl:apply-templates select="key('groups', 'New York')[1]"/>
      <xsl:apply-templates select="Event/City[generate-id() = generate-id(key('groups', .)[1])][. != 'New York']">
          <xsl:sort select="."/>
      </xsl:apply-templates>
    </xsl:template>
    
    <xsl:template match="City">
      <xsl:variable name="currentGroup" select="."/> 
      <b><xsl:value-of select="$currentGroup"/></b><br/>
      <xsl:for-each select="key('groups', $currentGroup)">
      <xsl:sort select="../Date"/>  
      <i>+ <xsl:value-of select="../Date"/> <xsl:value-of select="../Title"/></i><br/>  
      </xsl:for-each>  
    </xsl:template>
    
    
    </xsl:stylesheet>
    

    【讨论】:

    • 是的!这正是我在寻找&lt;xsl:apply-templates&gt; 标签的过滤语法。谢谢你。我的代码首先输出纽约,因为我有 2 个循环的丑陋解决方案,适用于纽约和其他人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2018-08-02
    • 1970-01-01
    • 2011-06-17
    • 2022-01-26
    相关资源
    最近更新 更多