2012-03-09 2 views
1

Я пытаюсь вычислить минимальное и максимальное время для группы результатов JMeter из XML следующим образом, но когда я вызываю свой шаблон min с помощью ../httpSample[@lb = current()/@lb]/@t, он не вычисляет время правильное.XSLT 1.0: Группирование и выбор времени для вычисления min

<httpSample t="758" lt="0" ts="1330176857546" s="false" lb="/app1/" tn="space Guest Users 2-4" dt="text" by="1446"/> 
<httpSample t="213" lt="0" ts="1330176858088" s="false" lb="/app2/" tn="space Logged In Users 1-28" dt="text" by="1446"/> 
<httpSample t="153" lt="0" ts="1330176858088" s="false" lb="/app2/" tn="space Logged In Users 1-28" dt="text" by="1446"/> 
<httpSample t="113" lt="0" ts="1330176858088" s="false" lb="/app2/" tn="space Logged In Users 1-28" dt="text" by="1446"/> 
<httpSample t="153" lt="0" ts="1330176858149" s="false" lb="/app3/" tn="space Logged In Users 1-29" dt="text" by="1446"/> 
<httpSample t="340" lt="0" ts="1330176857967" s="false" lb="/app3/" tn="space Logged In Users 1-26" dt="text" by="1446"/> 

Выражение в xsl:message../httpSample[@lb = current()/@lb] работает корректно с точки зрения группировки, но он не выбирает атрибут времени правильно.

Большое спасибо заранее.

<xsl:for-each select="/testResults/httpSample[not(@lb = preceding::*/@lb)]"> 

      <xsl:variable name="lab" select="@lb" /> 
      <xsl:variable name="count" select="count(../httpSample[@lb = current()/@lb])" /> 
      <xsl:variable name="failureCount" select="count(../httpSample[@lb = current()/@lb][attribute::s='false'])" /> 
      <xsl:variable name="successCount" select="count(../httpSample[@lb = current()/@lb][attribute::s='true'])" /> 
      <xsl:variable name="successPercent" select="$successCount div $count" /> 
      <xsl:variable name="totalTime" select="sum(../httpSample[@lb = current()/@lb]/@t)" /> 
      <xsl:variable name="averageTime" select="$totalTime div $count" /> 

      <xsl:message> 
       times: <xsl:copy-of select="../httpSample[@lb = current()/@lb]/@t"/> 
      </xsl:message> 

      <xsl:variable name="minTime"> 
       <xsl:call-template name="min"> 
        <xsl:with-param name="nodes" select="../httpSample[@lb = current()/@lb]/@t" /> 
       </xsl:call-template> 
      </xsl:variable> 

... 

<xsl:template name="min"> 
    <xsl:param name="nodes" select="/.." /> 

    <!-- Broken when we get here --> 
    <xsl:choose> 
     <xsl:when test="not($nodes)">NaN</xsl:when> 
     <xsl:otherwise> 
      <xsl:for-each select="$nodes"> 
       <xsl:sort data-type="number" /> 
       <xsl:if test="position() = 1"> 
        <xsl:value-of select="number(.)" /> 
       </xsl:if> 
      </xsl:for-each> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

ответ

0

Я предлагаю вам группировать по-разному. Ниже приведено решение XSLT 2.0 - если вы хотите XSLT 1.0, просто дайте мне знать. Нетрудно будет усовершенствовать ниже.

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <output> 
      <xsl:for-each-group select="root/httpSample" group-by="@lb"> 
       <httpSampleGroup> 
        <lb><xsl:value-of select="current-grouping-key()"/></lb> 
        <minT><xsl:value-of select="min(current-group()/@t)"/></minT> 
       </httpSampleGroup> 
      </xsl:for-each-group> 
     </output> 
    </xsl:template> 
</xsl:stylesheet> 

С вашей входной (плюс корневого узла) это дает

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <httpSampleGroup> 
     <lb>/app1/</lb> 
     <minT>758</minT> 
    </httpSampleGroup> 
    <httpSampleGroup> 
     <lb>/app2/</lb> 
     <minT>113</minT> 
    </httpSampleGroup> 
    <httpSampleGroup> 
     <lb>/app3/</lb> 
     <minT>153</minT> 
    </httpSampleGroup> 
</output> 
0

Я прикоснулся код только немного, и теперь он работает, как ожидалось:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:for-each select= 
    "/testResults/httpSample[not(@lb = preceding::*/@lb)]"> 

       <xsl:variable name="lab" select="@lb" /> 
       <xsl:variable name="count" select="count(../httpSample[@lb = current()/@lb])" /> 
       <xsl:variable name="failureCount" select="count(../httpSample[@lb = current()/@lb][attribute::s='false'])" /> 
       <xsl:variable name="successCount" select="count(../httpSample[@lb = current()/@lb][attribute::s='true'])" /> 
       <xsl:variable name="successPercent" select="$successCount div $count" /> 
       <xsl:variable name="totalTime" select="sum(../httpSample[@lb = current()/@lb]/@t)" /> 
       <xsl:variable name="averageTime" select="$totalTime div $count" /> 

       <xsl:message> 
        times: 
        <xsl:for-each select="../httpSample[@lb = current()/@lb]"> 
         <xsl:if test="not(position() = 1)">,</xsl:if> 
         <xsl:value-of select="@t"/> 
        </xsl:for-each> 
       </xsl:message> 

       <xsl:variable name="minTime"> 
        <xsl:call-template name="min"> 
         <xsl:with-param name="nodes" select="../httpSample[@lb = current()/@lb]/@t" /> 
        </xsl:call-template> 
       </xsl:variable> 

       Min time: <xsl:value-of select="$minTime"/> 
    </xsl:for-each> 
</xsl:template> 

    <xsl:template name="min"> 
     <xsl:param name="nodes" select="/.." /> 

     <!-- Broken when we get here --> 
     <xsl:choose> 
      <xsl:when test="not($nodes)">NaN</xsl:when> 
      <xsl:otherwise> 
       <xsl:for-each select="$nodes"> 
        <xsl:sort data-type="number" /> 
        <xsl:if test="position() = 1"> 
         <xsl:value-of select="number(.)" /> 
        </xsl:if> 
       </xsl:for-each> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется к предоставленному XML-документу:

<testResults> 
    <httpSample t="758" lt="0" ts="1330176857546" 
    s="false" lb="/app1/" 
    tn="space Guest Users 2-4" dt="text" 
    by="1446"/> 
    <httpSample t="213" lt="0" ts="1330176858088" 
    s="false" lb="/app2/" 
    tn="space Logged In Users 1-28" dt="text" 
    by="1446"/> 
    <httpSample t="153" lt="0" ts="1330176858088" 
    s="false" lb="/app2/" 
    tn="space Logged In Users 1-28" dt="text" 
    by="1446"/> 
    <httpSample t="113" lt="0" ts="1330176858088" 
    s="false" lb="/app2/" 
    tn="space Logged In Users 1-28" dt="text" 
    by="1446"/> 
    <httpSample t="153" lt="0" ts="1330176858149" 
    s="false" lb="/app3/" 
    tn="space Logged In Users 1-29" dt="text" 
    by="1446"/> 
    <httpSample t="340" lt="0" ts="1330176857967" 
    s="false" lb="/app3/" 
    tn="space Logged In Users 1-26" dt="text" 
    by="1446"/> 
</testResults> 

разыскиваемый правильный результат (в том числе отладочного вывода) производится:

  Min time: 758 

      Min time: 113 

      Min time: 153 
Смежные вопросы