
本文介绍如何利用 xslt 3 的高级文本处理能力(配合 python 的 `saxonche` 库),精准定位 xml `
` 标签内嵌套 `` 等子元素时的软件名称,并基于 json 提供的上下文与偏移信息,将其安全包裹在 `
在科研文献或技术文档的 XML 标注任务中,常需从混合内容(mixed content)的
段落中识别特定软件名称(如 MODELLER、PROSA),并为其添加语义化标签(如
推荐方案是采用 XSLT 3 + SaxonC —— 这一组合支持原生 jsON 解析、高阶迭代(xsl:iterate)、文本分析(analyze-String)及隧道参数(tunnel parameters),能完美应对“上下文驱动”的精准定位需求。
以下是一个可直接运行的完整流程:
✅ 步骤 1:安装依赖
pip install saxonche
✅ 步骤 2:准备 XSLT 脚本(wrap-software.xsl)
{.}
? 说明:json-doc(‘software-mentions.json’) 会自动解析 JSON 文件;若需调试,也可将 JSON 内联为 […] 并改用 parse-json($json-data)。
✅ 步骤 3:python 调用示例
from saxonche import PySaxonProcessor # 输入 XML 和 XSLT 路径 xml_file = "input.xml" xslt_file = "wrap-software.xsl" with PySaxonProcessor() as proc: xslt_proc = proc.new_xslt30_processor() # 执行转换 output = xslt_proc.transform_to_string( source_file=xml_file, stylesheet_file=xslt_file ) print(output)
⚠️ 注意事项
- 上下文匹配优先级:XSLT 先验证整个
是否包含 context 字符串,再在匹配的文本节点中查找 normalizedForm,确保不跨句误包(例如避免将 MODEL 错包为 MODELLER 的子串)。
- 嵌套安全:xsl:iterate 逐个应用软件规则,且 mode=”process” 严格作用于 text() 节点,完全保留 、 等子元素结构。
- 大小写敏感:默认区分大小写;如需忽略,可将 contains() 替换为 matches(., concat(‘b’, $software?software-name?normalizedForm, ‘b’), ‘i’)。
- 性能提示:对于超大 XML,建议预筛选
标签(如先用 lxml 提取含关键词的段落再交由 XSLT 处理)。
该方法以声明式逻辑替代脆弱的手动 DOM 操作,兼具准确性、可维护性与扩展性——未来新增软件只需更新 JSON,无需修改代码。