计算xslt中的子集

时间:2015-10-23 21:25:43

标签: xml xslt

我得到了一个简单的关于电影的xml,如下所示:

<movies>
	
	<!-- 1 -->
    <movie>      
        <movieID>0108052</movieID>     
      
        <title>Schindler's List</title>
      
        <director>Steven Spielberg</director>  
  
        <year>1993</year>
      
        <genre>Biography, Drama, History</genre>
		
		<link>http://www.imdb.com/title/tt0108052/</link>
    </movie>
    
	<!-- 2 -->
    <movie>      
        <movieID>0914798</movieID>     
      
        <title>The Boy in the Striped Pajamas</title>
      
        <director>Mark Herman</director>  
  
        <year>2008</year>
      
        <genre>Drama, War, History</genre>

		<link>http://www.imdb.com/title/tt0914798/</link>		
    </movie>

</movies>

现在我根据电影的哪一年制作了一些桌子。最后,我想添加一个额外的页脚行,说明当年制作了多少部电影。我用了这段代码:

<td>Number of Movies: <xsl:value-of select="count(movies/movie)"/> </td>

但这只能给我xml中的所有电影,有没有什么方法可以限制它在2004年之后完成的电影?我想也许可以计算表中的行数,如果可行并执行算术,但我不知道xslt是否可以这样做。

我用这个创建表:

<xsl:for-each select="movies/movie">
		  <!-- Sort by title -->
		    <xsl:sort select="title"/>
			<xsl:if test="year>=2005">
			
			<tr bgcolor="#3D9999">
			
			  <td>
			  	<!-- Look for link, target to blank, the link text is the tittle pulled from xml -->
                <a href="{link}" target="_blank"><xsl:value-of select="title"/></a>
              </td>
			  
              <td>
			    <xsl:value-of select="director"/>
			  </td>
			  
			  <td>
                <xsl:value-of select="year"/>
              </td>
			  
			  <td>
                <xsl:value-of select="genre"/>
              </td>
			  
			  <td>
                <xsl:value-of select="movieID"/>
              </td>
			 </tr>
			 </xsl:if>
          </xsl:for-each>

1 个答案:

答案 0 :(得分:1)

您可以过滤表达式来计算像这样的子集:

<xsl:value-of select="count(movies/movie[year>=2005])"/>

每年输出电影数量可以通过使用XSLT 1.0的key功能进行分组来完成:

<?xml version="1.0"?>

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

  <xsl:key name="movie_year" match="movie" use="year" />

  <xsl:template match="movies">
    <table>
      <tr>
        <th>Year</th>
        <th># movies</th>
      </tr>
      <xsl:for-each select="movie[generate-id(.)=generate-id(key('movie_year', year))]">
        <xsl:variable name='this' select="."/>
        <tr>
          <td><xsl:value-of select="year"/></td>
          <td><xsl:value-of select="count(../movie[year=$this/year])"/></td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>

</xsl:stylesheet>