2013-12-18 64 views
1

我需要創建一個表,它應該顯示平均最小值和最大值。這是我能夠做到的。但我需要以最高的平均值對錶格進行排序。這是如何完成的? 示例XML是如何使用xslt排序最高的平均值使用xslt

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="simpleReport.xsl"?> 
<Results> 
    <Sample time="1797" prod="Val1" /> 
    <Sample time="919" prod="Val2" /> 
    <Sample time="2680" prod="Val3" /> 
    <Sample time="545" prod="Val1" /> 
    <Sample time="520" prod="Val2" /> 
    <Sample time="1041" prod="Val3" /> 
    <Sample time="543" prod="Val1" /> 
    <Sample time="491" prod="Val2" /> 
    <Sample time="286" prod="Val3" /> 
    <Sample time="283" prod="Val1" /> 
    <Sample time="782" prod="Val2" /> 
    <Sample time="440" prod="Val2" /> 
</Results> 

這是我在做什麼的

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="html" indent="yes" encoding="UTF-8" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" /> 
<xsl:param name="prodReport" select="'Results'"/> 
<xsl:template match="Results"> 
    <html> 
     <head> 
      <title><xsl:value-of select="$prodReport" /></title> 
     </head> 
     <body> 
      <xsl:call-template name="ProductList" /> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template name="ProductList"> 
    <h2>Pages</h2> 
    <table align="center" class="details" border="0" cellpadding="5" cellspacing="2" width="95%"> 
     <tr valign="top"> 
      <th>Sample</th> 
      <th>Count</th> 
      <th>Average Time</th> 
     </tr> 
     <xsl:for-each select="/Results/*[not(@prod = preceding::*/@prod)]"> 
      <xsl:variable name="prodName" select="@prod" /> 
      <xsl:variable name="count" select="count(../*[@prod = current()/@prod])" /> 
      <xsl:variable name="totalTime" select="sum(../*[@prod = current()/@prod]/@time)" /> 
      <xsl:variable name="averageTime" select="$totalTime div $count" /> 
      <tr valign="top"> 
       <td> 
        <xsl:value-of select="$prodName" /> 
       </td> 
       <td align="center"> 
        <xsl:value-of select="$count" /> 
       </td> 
       <td align="right"> 
         <xsl:value-of select="$averageTime" /> 
       </td> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 
</xsl:stylesheet> 

如何排序基於計算的平均值計算平均? HTML表格列將是ProdName Count AverageTime。平均時間將按降序排列。

謝謝

+0

見http://stackoverflow.com/questions/758527/xsl-how-can-i-group-and-sort-based-on- sum –

+0

請包含更多樣式表,以及您期望的輸出XML(HTML)。 –

+0

我已更新我的樣式表。我經歷了鏈接,但不明白「sum(key('kResultByOwner',@Owner)/ @ * [name()= $ pSortBy]) – kumar

回答

0

無法通過變量進行排序。但是,您可以通過綁定到所討論的變量的表達式進行排序。使用下列表達式作爲第一個元素在你的<xsl:for-each/>表達:

<xsl:sort data-type="number" order="descending" 
      select="sum(../*[@prod = current()/@prod]/@time) div 
        count(../*[@prod = current()/@prod])"/> 
+0

感謝這個工作,但你能解釋一下,這個聲明是怎麼知道的這個語句似乎沒有指定任何列 – kumar

+0

''元素的'select'屬性中的路徑表達式是相對於上下文節點計算的,該節點由'select'屬性''元素,這和你現有的變量綁定完全一樣。 – joemfb