MIN和MAX值以及它的时间

时间:2018-04-07 09:39:43

标签: xml xslt-2.0

我正在回答这个问题XSL transformation - XML data to HTML table。如何找出@ label =“memory”和@ label =“cpu”的最小值和最大值以及@time是什么时候?

 <?xml version="1.0" encoding="UTF-8"?>
    <root>
        <sample time="14" label="cpu_0">
            <value>22</value>
        </sample>
        <sample time="14" label="cpu_2">
            <value>6</value>
        </sample>
        <sample time="1" label="cpu_2">
            <value>4</value>
        </sample>
        <sample time="14" label="memory">
            <value>97</value>
        </sample>
        <sample time="1" label="cpu_0">
            <value>28</value>
        </sample>
        <sample time="14" label="cpu_1">
            <value>52</value>
        </sample>
        <sample time="1" label="memory">
            <value>55</value>
        </sample>
        <sample time="1" label="cpu_1">
            <value>21</value>
        </sample>
    </root>

万分结果

MEMORY
syntax: min/max: @value (@time)
min: 55 (1)
max: 97 (14)

CPU
syntax: min/max (CPU_number): @value (@time)
min: (CPU_2): 4 (1)
max: (CPU_1): 52 (14)

我正在使用XSLT 2.0

1 个答案:

答案 0 :(得分:0)

如果按label属性进行分组,或者使用为CPU值剥离后缀_digit的属性进行分组,然后按value对每个组进行排序,则可以输出第一个( min)和排序组成员的最后(最大):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    expand-text="yes"
    version="3.0">

  <xsl:output method="text"/>

  <xsl:template match="root">
      <xsl:for-each-group select="sample" group-by="replace(@label, '_[0-9]+$', '')">
          <xsl:value-of select="upper-case(current-grouping-key())"/>:
          <xsl:for-each select="current-group()">
              <xsl:sort select="xs:decimal(value)"/>
              <xsl:if test="position() eq 1">
                  min : {value} ({@time})
              </xsl:if>
              <xsl:if test="position() eq last()">
                  max : {value} ({@time})
              </xsl:if>          </xsl:for-each>
      </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

以上和在线示例https://xsltfiddle.liberty-development.net/pPqsHT1/1正在使用XSLT 3,但在XSLT 2中分组和排序是相同的,您只需输出xsl:value-of而不是文本值所需的任何数据模板使用{}