XSLT实现为XML每个record添加去重升序start_date新节点
实现代码
<?xml version="1.0" encoding="UTF-8"?> <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:output method="xml" encoding="UTF-8" indent="yes" /> <xsl:template match="/"> <root> <xsl:for-each select="//record"> <record> <xsl:copy-of select="./*"/> <StartDates> <!-- 取当前record下所有start_date值去重,按日期升序排列 --> <xsl:for-each select="distinct-values(descendant::start_date/text())"> <xsl:sort select="xs:date(.)" order="ascending"/> <start_date> <xsl:value-of select="."/> </start_date> </xsl:for-each> </StartDates> </record> </xsl:for-each> </root> </xsl:template> </xsl:stylesheet>
逻辑说明
- 直接在生成StartDates节点的位置完成去重、排序逻辑,避免跨上下文取值错误
- 用XSLT 2.0内置的
distinct-values()函数对当前record下的所有start_date文本值去重,descendant::start_date限定了仅取当前循环的record节点下的后代节点,不会跨record取值 - 排序时直接将日期字符串转为
xs:date类型,ISO标准格式的日期可直接按日期规则排序,无需手动替换横杠转数字 - 遍历去重排序后的日期值,逐个生成start_date节点,输出结果完全匹配预期要求
内容的提问来源于stack exchange,提问作者VoiceOfReason
相关产品推荐
相关产品推荐

