如何使用XSLT1.0从XML日期列筛选最大日期对应数据
XSLT1.0 提取COL4最大日期对应的PositionMaster节点
核心思路
XSLT1.0没有原生的max()函数,需先通过排序找到最大日期值,再筛选出对应日期的PositionMaster节点。
示例XML数据
<Root> <PositionMaster> <COL1>POS001</COL1> <COL2>DeptA</COL2> <COL3>Manager</COL3> <COL4>2024-04-15</COL4> </PositionMaster> <PositionMaster> <COL1>POS002</COL1> <COL2>DeptB</COL2> <COL3>Engineer</COL3> <COL4>2024-05-20</COL4> </PositionMaster> <PositionMaster> <COL1>POS003</COL1> <COL2>DeptC</COL2> <COL3>Analyst</COL3> <COL4>2024-05-20</COL4> </PositionMaster> </Root>
修改后的XSLT1.0代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 获取所有PositionMaster节点中COL4的最大日期 --> <xsl:variable name="maxDate"> <xsl:for-each select="/Root/PositionMaster"> <!-- 按COL4降序排序(ISO日期格式下文本排序有效) --> <xsl:sort select="COL4" data-type="text" order="descending"/> <xsl:if test="position() = 1"> <xsl:value-of select="COL4"/> </xsl:if> </xsl:for-each> </xsl:variable> <!-- 输出根节点及对应最大日期的PositionMaster --> <xsl:template match="/"> <Root> <!-- 复制所有COL4等于最大日期的PositionMaster节点 --> <xsl:copy-of select="/Root/PositionMaster[COL4 = $maxDate]"/> </Root> </xsl:template> </xsl:stylesheet>
关键说明
- 排序取最大日期:通过
xsl:for-each遍历所有PositionMaster,按COL4降序排序后取第一个节点的日期值,存入变量$maxDate。 - 筛选匹配节点:用
xsl:copy-of复制所有COL4值等于$maxDate的PositionMaster节点,仅保留最大日期对应的数据。 - 非ISO日期适配:如果
COL4是DD/MM/YYYY这类非ISO格式,需拆分字符串重组为可排序格式后再执行排序逻辑。
内容的提问来源于stack exchange,提问作者Kuldeep Rajput
相关产品推荐
相关产品推荐

