XML按section拆分及按层级添加自定义属性的XSLT求助
解决XML拆分后按层级添加自定义属性的问题
核心实现思路
- 先计算整个文档中
<section>的最大层级(通过统计每个<section>的ancestor::section数量+1,取最大值) - 根据最大层级匹配对应的规则,为指定层级的
<section>添加自定义属性 - 将属性添加逻辑整合到已有的拆分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
相关产品推荐
相关产品推荐

