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

XML按section拆分及按层级添加自定义属性的XSLT求助

解决XML拆分后按层级添加自定义属性的问题

核心实现思路

  1. 先计算整个文档中<section>的最大层级(通过统计每个<section>的ancestor::section数量+1,取最大值)
  2. 根据最大层级匹配对应的规则,为指定层级的<section>添加自定义属性
  3. 将属性添加逻辑整合到已有的拆分XSLT代码中,不影响原有的文件夹创建和文件拆分逻辑

完整XSLT代码示例

以下代码包含属性添加逻辑,可直接整合到你现有的拆分代码中:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 输出XML格式配置 -->
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <!-- 计算文档中section的最大层级 -->
  <xsl:variable name="max-section-level" select="max(//section/count(ancestor::section) + 1)"/>

  <!-- 复制所有节点的默认模板 -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 处理section元素,添加自定义属性 -->
  <xsl:template match="section">
    <xsl:copy>
      <!-- 计算当前section的层级 -->
      <xsl:variable name="current-level" select="count(ancestor::section) + 1"/>
      
      <!-- 根据最大层级匹配规则添加属性 -->
      <xsl:choose>
        <!-- 场景1:层级≥5,给4、5级section加属性 -->
        <xsl:when test="$max-section-level >= 5">
          <xsl:if test="$current-level = 4 or $current-level = 5">
            <xsl:attribute name="custom-attr">target-value</xsl:attribute>
          </xsl:if>
        </xsl:when>
        <!-- 场景2:层级≤4(即最大层级为4),给3、4级加属性 -->
        <xsl:when test="$max-section-level = 4">
          <xsl:if test="$current-level = 3 or $current-level = 4">
            <xsl:attribute name="custom-attr">target-value</xsl:attribute>
          </xsl:if>
        </xsl:when>
        <!-- 场景3:层级≤3(即最大层级为3),给2、3级加属性 -->
        <xsl:when test="$max-section-level = 3">
          <xsl:if test="$current-level = 2 or $current-level = 3">
            <xsl:attribute name="custom-attr">target-value</xsl:attribute>
          </xsl:if>
        </xsl:when>
        <!-- 场景4:层级≤2(即最大层级为2),给2级加属性 -->
        <xsl:when test="$max-section-level = 2">
          <xsl:if test="$current-level = 2">
            <xsl:attribute name="custom-attr">target-value</xsl:attribute>
          </xsl:if>
        </xsl:when>
      </xsl:choose>

      <!-- 复制原section的所有属性和子节点 -->
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 保留你原有的拆分逻辑(按section/@id创建文件夹和输出文件) -->
  <xsl:template match="/">
    <xsl:apply-templates select="//section"/>
  </xsl:template>

  <!-- 示例拆分逻辑(替换为你已有的代码) -->
  <xsl:template match="section">
    <!-- 根据section层级创建路径,比如id为1.1.1的section,路径为1/1.1/1.1.1/ -->
    <xsl:variable name="output-path" select="string-join(tokenize(@id, '\.'), '/')"/>
    <xsl:result-document href="{$output-path}/section.xml">
      <xsl:copy-of select="."/>
    </xsl:result-document>
    <!-- 递归处理子section -->
    <xsl:apply-templates select="section"/>
  </xsl:template>
</xsl:stylesheet>

关键逻辑说明

  • 层级计算:count(ancestor::section) + 1 可以准确得到当前<section>的层级(根section层级为1,子section层级依次+1)
  • 规则匹配:通过$max-section-level判断文档所属场景,再根据$current-level确定是否为目标层级,添加自定义属性
  • 兼容原有拆分:属性添加逻辑独立于拆分逻辑,仅在处理<section>元素时插入,不会影响原有的文件夹创建和文件输出

场景验证示例

场景1:最大层级≥5

输入片段:

content

输出片段(4、5级section添加属性):

content

场景2:最大层级=4

输入片段:

content

输出片段(3、4级section添加属性):

content

场景3:最大层级=3

输入片段:

content

输出片段(2、3级section添加属性):

content

场景4:最大层级=2

输入片段:

content

输出片段(仅2级section添加属性):

content

内容的提问来源于stack exchange,提问作者Kita Ansari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:27:17