在for-each XSLT中计算的最大值

时间:2015-03-23 12:19:52

标签: xml xslt foreach xslt-2.0

我正计算for-each中的最大日期@target_date_calc_end,但我有两个嵌套for-each,这是一个问题。

概述: 我有这个XML:

<asset>
  <child_asset_rel child_asset="124510"/>
  <child_asset_rel child_asset="124509"/>
  <child_asset_rel child_asset="124508"/>
  <child_asset_rel child_asset="124511"/>
  <child_asset_rel child_asset="124506"/>
  <child_asset_rel child_asset="124495"/>
</asset>

每个子节点通过child_asset=" "引用另一个XML文件,其格式为:

<asset id="124510">
  <schedule_step target_date_calc_end="2015-07-07T22:00:00Z"/>
  <schedule_step target_date_calc_end="2015-08-17T22:00:00Z"/>
  <schedule_step target_date_calc_end="2015-08-20T21:59:00Z"/>
  <schedule_step target_date_calc_end="2015-08-20T21:59:00Z"/>
  <schedule_step target_date_calc_end="2015-07-15T22:00:00Z"/>
</asset>

有几个日期target_date_calc_end="..."

我想遍历所有节点,加载子文件并计算文件的最大日期。

这是我的尝试:

<xsl:template match="/">
        <xsl:for-each select="$asset/child_asset_rel/@child_asset">

            <xsl:variable name="childAssetXML">
                <xsl:copy-of select="cs:get-asset(.)"/>
            </xsl:variable>

            <xsl:variable name="endDate">
                    <xsl:for-each select="$childAssetXML/asset/schedule_step/@target_date_calc_end">
                    <xsl:sort select="." order="descending"/>
                        <xsl:if test="position() = 1">
                            <xsl:value-of select="."/>
                        </xsl:if>
                    </xsl:for-each>
                </xsl:variable>

                    <xsl:value-of select="$endDate"/>   
        </xsl:for-each>

  </xsl:template>

在第一个for-each()中完成的第一步是寻找 儿童。我得到一个ID并使用函数get-asset()来获取子文件的XML,该文件存储在childAssetXML中。

我在for-each的每次迭代中正确地获取了endDate变量中每个子节点的最大日期,但是在所有迭代之后我无法获得endDate的最大值。我得到的输出是内循环的最后一次迭代的最大值。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

尝试max($asset/child_asset_rel/cs:get-asset(@child_asset)/asset/schedule_step/xs:dateTime(@target_date_calc_end))max($asset/child_asset_rel/cs:get-asset(@child_asset)/schedule_step/xs:dateTime(@target_date_calc_end)),具体取决于您的函数cs:get-asset返回的内容。