XSL 转换提取最小和最大日期
Posted
技术标签:
【中文标题】XSL 转换提取最小和最大日期【英文标题】:XSL Transform extracting min and max dates 【发布时间】:2013-02-23 03:05:05 【问题描述】:我正在尝试从 XML 源中提取最小和最大日期。我将一个节点集放入我的变量中,我需要节点中的实际日期值,但找不到如何获取它。
源 XML:
<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>
XSL 代码:
<xsl:if test="//StartDate != '' and //EndDate != ''">
<xsl:variable name ="startDate">
<xsl:for-each select="//StartDate">
<xsl:sort select="StartDate" data-type="text" order="ascending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="." />
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name ="endDate">
<xsl:for-each select="//EndDate">
<xsl:sort select="EndDate" data-type="text" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="." />
</xsl:if>
</xsl:for-each>
</xsl:variable>
</xsl:if>
日期格式正确以支持排序和检索,问题是一旦填充变量我找不到如何访问它们的值:
【问题讨论】:
这一切都设置为获取两个值之间的差异,即周期中的天数。 【参考方案1】:如果您使用的是 XSLT 2.0,则有 min
和 max
函数可以为您工作。 XSLT 1.0 没有这些功能,但是您可以通过这样做来作弊(对于大型输入可能效率很低,但它确实有效):
<xsl:variable name="startDate" select="string(//StartDate[not(. > //StartDate)])" />
endDate 也是如此。这里的诀窍是,您正在寻找没有其他 StartDate 大于 d 的 StartDate d。
【讨论】:
谢谢,伊恩。我应该指定,这是 XSLT 1.0。 输入永远不会太大,我从中提取此示例数据的完整文件只有 339 行,并且大多数时间将有 1-4 个 servicePeriod 日期实例。你的例子/想法很棒,但我正在用它拉一个空字符串。 DOH,我需要更新名称,懒惰.....以上是关于XSL 转换提取最小和最大日期的主要内容,如果未能解决你的问题,请参考以下文章