1

最大 3 つの 3 種類の値が必要です。私はこれに似た構造を持っています。

注: 最初の 2 つの回答は、前の例の 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(//レコード/最大 | //日/セット/(平均 + 平均を上回る最大)) | //夜/セット/(平均+最大平均以上))

動作しません。|-記号はノードに対してのみ機能します。次のエラーが発生します。

'|' の第 2 オペランドの必須項目タイプ ノード()です。指定された値の項目タイプは xs:double です

xpath 2.0 と xslt 2.0 を使用しています。

4

2 に答える 2

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 に答える