XSL Transform使用XSLT 2.0提取最小和最大日期

时间:2014-05-20 11:51:25

标签: xpath xslt-2.0

我有重复的XML结构,我想使用xslt 2.0中的max()和min()函数来获取最大和最小日期。

我正在使用像max(Detail / Startdate)这样的结果,它返回NaN作为结果。有人可以帮帮我吗?

<Info dataSource="source">
<Detail>
    <StartDate>20121211</StartDate>
    <EndDate>20130112</EndDate>
</Detail>
<Detail>
    <StartDate>20121211</StartDate>
    <EndDate>20130112</EndDate>
</Detail>
<Detail>
    <StartDate>20121211</StartDate>
    <EndDate>20130112</EndDate>
</Detail>
<Detail>
    <StartDate>20121218</StartDate>
    <EndDate>20130114</EndDate>
</Detail>
</Info>

1 个答案:

答案 0 :(得分:2)

对于您发布的样本和XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

<xsl:template match="Info">
  <xsl:value-of select="max(Detail/StartDate), max(Detail/EndDate), min(Detail/StartDate), min(Detail/EndDate)"/>
</xsl:template>

</xsl:stylesheet>

撒克逊9.5给了我2.0121218E7 2.0130114E7 2.0121211E7 2.0130112E7而不是NaN。显然将这些日期值视为双精度并不是理想的方法,所以我建议使用类似的东西

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="xs mf">

<xsl:function name="mf:date" as="xs:date">
  <xsl:param name="date" as="xs:string"/>
  <xsl:sequence select="xs:date(concat(substring($date, 1, 4), '-', substring($date, 5, 2), '-', substring($date, 7)))"/>
</xsl:function>

<xsl:template match="Info">
  <xsl:value-of select="max(Detail/StartDate/mf:date(.)), max(Detail/EndDate/mf:date(.)), min(Detail/StartDate/mf:date(.)), min(Detail/EndDate/mf:date(.))"/>
</xsl:template>

</xsl:stylesheet>

首先转换为xs:date,然后计算最大或最小日期,而不是最大或最小数量。

如果您仍有问题,请发布足够的信息以便我们重现问题。