如何在XSLT中从子节点获取指定日期并更新父节点ffDate
解决方案:用XSLT更新节点的值
核心思路
- 遍历
下的所有 节点,优先筛选 <ref>文本包含PS的节点,提取这些节点的<subDate>,取**最新(最大)**的日期作为<ffDate>的新值 - 若没有符合条件的
<rec>,则提取所有<rec>的<subDate>,取**最早(最小)**的日期更新<ffDate>
完整XSLT代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份转换模板:原样保留所有未被特殊匹配的节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配<rf>下的<ffDate>,替换其值 --> <xsl:template match="rf/ffDate"> <ffDate> <xsl:choose> <!-- 优先处理含PS的rec节点 --> <xsl:when test="../rec[contains(ref, 'PS')]"> <xsl:value-of select="max(../rec[contains(ref, 'PS')]/subDate)"/> </xsl:when> <!-- 无PS节点时取所有rec的最早日期 --> <xsl:otherwise> <xsl:value-of select="min(../rec/subDate)"/> </xsl:otherwise> </xsl:choose> </ffDate> </xsl:template> </xsl:stylesheet>
关键细节说明
- 节点筛选:
contains(ref, 'PS')用于匹配<ref>文本中包含PS的<rec>节点,区分大小写;如需忽略大小写可改用contains(upper-case(ref), 'PS') - 日期计算:
max()和min()函数要求<subDate>的日期格式符合XML标准(如YYYY-MM-DD),XSLT 2.0及以上版本原生支持对日期类型的比较 - 身份转换:确保XML文档中除
<ffDate>外的所有节点、属性、文本都保持原样,不会破坏原有结构
内容的提问来源于stack exchange,提问作者user13583928
相关产品推荐
相关产品推荐

