1

我需要三种三种值的最大值。我有一个类似的结构。

注意:前两个答案基于前面的示例 xml(在晚上的第 2 组中,最大值高于平均值为 8)。这很令人困惑,所以我将其更改为 7。

<data>
    <record>
        <max>60</max>
    </record>
    <day>
        <set>
            <average>49</average>
            <max-above-average>3</max-above-average>
        </set>
        <set>
            <average>45</average>
            <max-above-average>9</max-above-average>
        </set>
    </day>
    <night>
        <set>
            <average>50</average>
            <max-above-average>5</max-above-average>
        </set>
        <set>
            <average>52</average>
            <max-above-average>7</max-above-average>
        </set>
    </night>
</data>

现在我需要最大的记录,白天和黑夜。这将是最大值:60,本例中记录的值:60 = 60, > 49 + 3, 45 +9, 50 + 5, 52+7。需要计算白天和黑夜的最大值。因为这

max(//record/max | //day/set/(average + max-above-average)) | //晚上/设置/(平均+最大高于平均))

不起作用。|-符号仅适用于节点。它给出以下错误:

'|' 的第二个操作数的必需项类型 是节点();提供的值具有项目类型 xs:double

我正在使用 xpath 2.0 和 xslt 2.0。

4

2 回答 2

2

下面是需要的两个 XPath 2.0 表达式(分别用于生成“max”和“min”值):

max(/*/(day|night)/*/(average+max-above-average))

min(/*/(day|night)/*/(average -min-above-average))

基于 XSLT 2.0 的验证

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

 <xsl:template match="/">
 max: <xsl:text/>
  <xsl:sequence select=
    "max(/*/(day|night)/*/(average+max-above-average))"/>
 min: <xsl:text/>
  <xsl:sequence select=
    "min(/*/(day|night)/*/(average -min-above-average))"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<data>
    <record>
        <min>40</min>
        <max>60</max>
    </record>
    <day>
        <set>
            <average>49</average>
            <max-above-average>3</max-above-average>
            <min-above-average>15</min-above-average>
        </set>
        <set>
            <average>45</average>
            <max-above-average>9</max-above-average>
            <min-above-average>2</min-above-average>
        </set>
    </day>
    <night>
        <set>
            <average>50</average>
            <max-above-average>5</max-above-average>
            <min-above-average>6</min-above-average>
        </set>
        <set>
            <average>52</average>
            <max-above-average>8</max-above-average>
            <min-above-average>11</min-above-average>
        </set>
    </night>
</data>

计算两个 XPath 表达式,并将这些计算的结果复制到输出

 max: 60
 min: 34

更新

OP 在评论中说他想要“最大的日夜和记录”——我真的不明白他的意思。

这是我猜测的尝试:

max(
      (/*/record/max, 
       /*/(day|night)/*/(average+max-above-average, average+min-above-average)
       )
    )

当植入 XSLT 转换(上图)时,会产生:

 max: 64
于 2013-04-05T05:01:46.447 回答
1

XSLT 1.0 方法:

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

  <xsl:template match="/*">
    <xsl:variable name="recordMax" select="record/max" />
    <xsl:variable name="dayMax">
      <xsl:apply-templates select="day" mode="max" />
    </xsl:variable>
    <xsl:variable name="nightMax">
      <xsl:apply-templates select="night" mode="max" />
    </xsl:variable>

    <xsl:call-template name="Max">
      <xsl:with-param name="v1" select="$recordMax" />
      <xsl:with-param name="v2">
        <xsl:call-template name="Max">
          <xsl:with-param name="v1" select="$dayMax"  />
          <xsl:with-param name="v2" select="$nightMax" />
        </xsl:call-template>
      </xsl:with-param>
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="*[set]" mode="max">
    <xsl:apply-templates select="set" mode="max">
      <xsl:sort select="average + max-above-average"
                data-type="number"
                order="descending" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="set" mode="max">
    <xsl:if test="position() = 1">
      <xsl:value-of select="average + max-above-average" />
    </xsl:if>
  </xsl:template>

  <xsl:template name="Max">
    <xsl:param name="v1" />
    <xsl:param name="v2" />

    <xsl:choose>
      <xsl:when test="not($v2 > $v1)">
        <xsl:value-of select="$v1" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$v2" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

在您的示例输入上运行时,结果是:

60
于 2013-04-04T21:22:08.997 回答