使用 XSLT 3 精准标注 XML 中的软件名称(基于上下文与偏移定位)

发布时间 - 2026-01-31 00:00:00    点击率:

本文介绍如何利用 xslt 3 和 saxon-he(通过 python 的 `saxonche` 库)对嵌套 `` 标签的 `

` 段落中特定软件名进行精准包装,依据 json 提供的上下文和规范化名称实现语义化标注,避免正则误匹配与 dom 结构破坏。

在处理学术文献或技术文档的 XML 数据时,常需从富文本段落(如含 等内联标签的

)中识别并标注软件名称(如 “MODELLER”、“PROSA”)。难点在于:软件名可能夹杂在纯文本与子元素之间,传统字符串替换会破坏结构,而仅靠 itertext

() 或 lxml 的文本遍历又难以精确定位到原始上下文中的确切位置——尤其当 JSON 注释数据提供了带偏移量(offsetStart/offsetEnd)和完整上下文句子(context)时,应优先利用该语义信息而非盲目模式匹配。

XSLT 3 提供了强大且声明式的解决方案:它原生支持 JSON 解析(parse-json() / json-doc())、高阶迭代(xsl:iterate)、隧道参数(tunnel="yes")以及正则感知的文本分析(analyze-string),完美契合本任务需求。以下是一个可直接运行的端到端方案:

✅ 步骤一:安装依赖

pip install saxonche

✅ 步骤二:编写 XSLT 脚本(wrap-software.xsl)




  
  
    [{"type":"software","software-type":"software","software-name":{"rawForm":"MODELLER","normalizedForm":"MODELLER","offsetStart":79,"offsetEnd":87},"context":"The reliability of the model structure was tested using the ENERGY commands of MODELLER (Sali and Blundell, 1993)."}]
  
  

  
  
    
      
      
      
      
        
          
            
          
        
        
          
        
      
    
  

  
  
  
    
    
      
      
        
        
      
      
        
      
    
  

  
  
    {.}
  

  
  
  

✅ 步骤三:Python 调用执行(wrap.py)

from saxonche import PySaxonProcessor

# 加载 XML 和 XSLT
xml_content = '''

The reliability of the model structure was tested using the ENERGY commands of MODELLER (Sali and Blundell, 1993). The modelled structures were also validated using the program PROSA (Wiederstein and Sippl, 2007).

''' with PySaxonProcessor() as proc: xslt_proc = proc.new_xslt30_processor() # 直接传入 XML 字符串和 XSLT 文件路径 executable = xslt_proc.compile_stylesheet(stylesheet_file='wrap-software.xsl') output = executable.transform_to_string(xdm_node=proc.parse_xml(xml_text=xml_content)) print(output)

⚠️ 注意事项与最佳实践

  • 上下文匹配优先:XSLT 严格比对 context 字段与

    内纯文本拼接结果(string-join($p//text(), '')),确保仅在真实语境中触发标注,杜绝跨句误包。

  • 安全正则处理:analyze-string() 自动转义 normalizedForm 中的正则特殊字符(如 +, *, .),无需手动 re.escape()。
  • 多软件支持:xsl:iterate 可顺序处理 JSON 中全部软件条目;若多个软件共存于同一

    ,将按 JSON 顺序依次包装(无嵌套冲突)。

  • 性能提示:对于超大 XML,建议将 JSON 预加载为变量(json-doc()),避免重复解析;生产环境推荐使用 Saxon-HE Java 版本以获得更优性能。
  • 扩展性:如需支持大小写不敏感匹配,可将 contains() 替换为 matches(., concat('.*', $software?software-name?normalizedForm, '.*'), 'i')。

此方案摒弃了易出错的手动 DOM 拆解逻辑,以声明式、可验证、可复用的 XSLT 实现精准语义标注,是处理结构化文本中实体识别任务的专业级实践。


# python  # java  # js  # json  # node  # app  # ai  # String  # xml  # 字符串  # dom  # 是一个  # 加载  # 迭代  # 多个  # 遍历  # 推荐使用  # 可将  # 而非  # 可直接  # 如需 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Android okhttputils现在进度显示实例代码  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  开心动漫网站制作软件下载,十分开心动画为何停播?  奇安信“盘古石”团队突破 iOS 26.1 提权  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  JS中对数组元素进行增删改移的方法总结  微信小程序 wx.uploadFile无法上传解决办法  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  手机网站制作与建设方案,手机网站如何建设?  Laravel如何创建自定义Facades?(详细步骤)  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  如何快速搭建安全的FTP站点?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  敲碗10年!Mac系列传将迎来「触控与联网」双革新  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Laravel如何实现用户密码重置功能?(完整流程代码)  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  微信h5制作网站有哪些,免费微信H5页面制作工具?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何有效防御Web建站篡改攻击?  HTML 中动态设置元素 name 属性的正确语法详解  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Python高阶函数应用_函数作为参数说明【指导】  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何正确选择百度移动适配建站域名?  Linux网络带宽限制_tc配置实践解析【教程】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  Linux安全能力提升路径_长期防护思维说明【指导】  详解Oracle修改字段类型方法总结  Laravel如何记录自定义日志?(Log频道配置)  如何实现javascript表单验证_正则表达式有哪些实用技巧  PHP正则匹配日期和时间(时间戳转换)的实例代码  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?