You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT 3.0:满足条件时插入子节点的实现方案

XSLT 3.0 优化方案:用累加器实现Offering关联课程详情插入

原方案通过<xsl:if>逐个判断课程映射存在性,效率较低且代码冗余。以下是基于XSLT 3.0累加器的优化实现,既能高效关联课程,又保留错误校验逻辑:

1. 声明累加器收集所有源课程

先定义一个累加器,遍历源文档时将所有LearningCourse按课程编号存入Map,后续可快速查找:

<xsl:accumulator name="learning-courses" as="map(xs:string, element(LearningCourse))" initial-value="map{}">
  <xsl:accumulator-rule match="LearningCourse" select="map:put($value, string(Course-Number), .)"/>
</xsl:accumulator>

2. 修改Offering模板实现关联与校验

修改匹配<Offering>的模板,通过累加器直接获取对应课程,插入CourseDetails节点,同时保留课程不存在时的错误提示:

<xsl:template match="Offering">
  <xsl:copy>
    <!-- 保留Offering原有属性与子节点 -->
    <xsl:apply-templates select="@* | node()"/>
    
    <!-- 获取当前Offering的课程编号 -->
    <xsl:variable name="course-number" select="string(Course-Number)"/>
    <!-- 从累加器Map中匹配对应课程 -->
    <xsl:variable name="matched-course" select="accumulator-before('learning-courses')($course-number)"/>
    
    <!-- 找到匹配课程时插入CourseDetails -->
    <xsl:if test="$matched-course">
      <CourseDetails>
        <xsl:copy-of select="$matched-course"/>
      </CourseDetails>
    </xsl:if>
    
    <!-- 错误校验:课程不存在时输出警告 -->
    <xsl:if test="not($matched-course)">
      <xsl:message severity="warning">
        未找到与课程编号 {$course-number} 对应的源课程
      </xsl:message>
    </xsl:if>
  </xsl:copy>
</xsl:template>

优化优势

  • 性能提升:累加器仅遍历一次源课程,后续查找为O(1)时间复杂度,处理大量数据时优势明显
  • 代码解耦:将源课程收集逻辑与Offering处理逻辑分离,代码结构更清晰
  • 保留原有校验逻辑:完整保留了课程不存在时的错误提示,不破坏原有业务规则

内容的提问来源于stack exchange,提问作者Chris Tucker 2016

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:15:39