XSLT分组问题:如何按<div><head>拆分TEI XML文件?
TEI XML子章节拆分独立文件的XSLT 3.0实现
问题分析
你当前的XSLT仅生成纯文本<div class="test">,核心问题是没正确保留原XML节点结构,也未启用XSLT 3.0的多文件输出能力。
解决方案代码
以下是完整的XSLT 3.0脚本,可自动将每个<div>子章节拆分为独立文件,同时完整保留原标签结构:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://www.tei-c.org/ns/1.0"> <!-- 保留原XML命名空间,输出格式化XML --> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 匹配根节点,遍历所有带<head>的<div>子章节 --> <xsl:template match="/"> <xsl:for-each select="//div[head]"> <!-- 用<head>文本生成文件名,替换空格为下划线避免路径问题 --> <xsl:variable name="filename" select="concat(translate(head, ' ', '_'), '.xml')"/> <!-- 生成独立输出文件 --> <xsl:result-document href="{$filename}"> <!-- 完整复制当前<div>的所有节点及结构 --> <xsl:copy-of select="."/> </xsl:result-document> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键说明
- 保留标签结构:用
<xsl:copy-of select="."/>替代文本提取函数,完整复制目标<div>的所有子节点和标签。 - 多文件输出:依赖XSLT 3.0的
<xsl:result-document>元素,需确保使用支持该特性的处理器(如Saxon-HE 9.8及以上版本)。 - 文件名规则:示例用
<head>文本替换空格为下划线作为文件名,可根据需求修改$filename的生成逻辑(比如添加序号、前缀)。 - 命名空间适配:如果你的TEI文档带有命名空间,需在XSLT中声明对应前缀(如示例中的
tei:),避免节点匹配失败。
常见问题修正
如果之前的代码使用了<xsl:value-of>,会仅提取文本,替换为<xsl:copy-of>即可保留结构;若处理器不支持XSLT 3.0,需升级到兼容工具。
内容的提问来源于stack exchange,提问作者KWunsch
相关产品推荐
相关产品推荐

