我有重复的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>
答案 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
,然后计算最大或最小日期,而不是最大或最小数量。
如果您仍有问题,请发布足够的信息以便我们重现问题。