如何使用XSLT 1.0提取XML中YYYY/MM/DD格式的最大日期
XSLT 1.0 筛选最大日期节点实现方案
你给出的日期为固定YYYY/MM/DD格式,这类定长的年在前、月居中、日在后的日期字符串,字典序和实际日期大小顺序完全一致,不需要拆分年月日转数值比较,直接按字符串排序即可取到最大值。
基础实现代码
使用以下XSLT即可得到要求的输出结构:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Root"> <xsl:copy> <xsl:for-each select="Element"> <!-- 按StartDate属性倒序排列 --> <xsl:sort select="@StartDate" data-type="text" order="descending"/> <!-- 仅输出排序后第一个节点,即日期最大的节点 --> <xsl:if test="position() = 1"> <xsl:copy-of select="."/> </xsl:if> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet>
逻辑说明
- 匹配输入XML的
Root根节点,先复制根节点结构保证输出格式匹配要求 - 遍历所有
Element子节点时,通过<xsl:sort>按StartDate属性做倒序文本排序 - 排序完成后取第一个节点输出,该节点的
StartDate就是所有日期中的最大值
针对你给出的测试XML输入,运行上述XSLT后输出结果完全符合预期:
<Root> <Element StartDate="2013/12/31"/> </Root>
可选扩展:保留所有同最大值的节点
如果数据中可能存在多个Element节点的StartDate同为最大值,需要全部输出,可以替换为以下写法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Root"> <xsl:copy> <!-- 先计算得到最大日期值 --> <xsl:variable name="maxDate"> <xsl:for-each select="Element"> <xsl:sort select="@StartDate" data-type="text" order="descending"/> <xsl:if test="position() = 1"> <xsl:value-of select="@StartDate"/> </xsl:if> </xsl:for-each> </xsl:variable> <!-- 复制所有日期等于最大值的节点 --> <xsl:copy-of select="Element[@StartDate = $maxDate]"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
内容的提问来源于stack exchange,提问作者Sahal
相关产品推荐
相关产品推荐

