讲师中心 微信公众号
AI工具推荐 视频效率加速

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

小伟大大_2231

小伟大大_2231

发布时间:2026-01-31 21:30:01

|

346人浏览过

|

来源于php中文网

原创

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

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

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

在处理学术文献或技术文档的 XML 数据时,常需从富文本段落(如含 <ref>、<em> 等内联标签的 <p>)中识别并标注软件名称(如 “MODELLER”、“PROSA”)。难点在于:软件名可能夹杂在纯文本与子元素之间,传统字符串替换会破坏结构,而仅靠 itertext() 或 lxml 的文本遍历又难以精确定位到原始上下文中的确切位置——尤其当 JSON 注释数据提供了带偏移量(offsetStart/offsetEnd)和完整上下文句子(context)时,应优先利用该语义信息而非盲目模式匹配。

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

python-script-generator
python-script-generator

快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。

下载

✅ 步骤一:安装依赖

pip install saxonche

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

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">

  <!-- 读取 JSON 文件(或内联 JSON 字符串) -->
  <xsl:param name="json-data" as="xs:string">
    [{"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)."}]
  </xsl:param>
  <xsl:param name="json-doc" select="parse-json($json-data)"/>

  <!-- 主模板:对每个 <p> 迭代所有 software 条目 -->
  <xsl:template match="p">
    <xsl:iterate select="$json-doc?*[?type = 'software']">
      <xsl:param name="p" select="."/>
      <xsl:on-completion select="$p"/>
      <!-- 仅当当前 p 的文本内容包含该 software 的 context 时才处理 -->
      <xsl:if test="contains(string-join($p//text(), ''), ?context)">
        <xsl:variable name="transformed-p" as="element(p)">
          <xsl:apply-templates select="$p" mode="process">
            <xsl:with-param name="software" select="." tunnel="yes"/>
          </xsl:apply-templates>
        </xsl:variable>
        <xsl:next-iteration>
          <xsl:with-param name="p" select="$transformed-p"/>
        </xsl:next-iteration>
      </xsl:if>
    </xsl:iterate>
  </xsl:template>

  <!-- 处理模式:仅作用于文本节点 -->
  <xsl:mode name="process" on-no-match="shallow-copy"/>
  <xsl:template mode="process" match="p//text()">
    <xsl:param name="software" tunnel="yes" as="map(*)"/>
    <xsl:choose>
      <!-- 判断该文本是否属于目标 context,且包含 normalizedForm -->
      <xsl:when test="contains($software?context, .) and contains(., $software?software-name?normalizedForm)">
        <!-- 使用 analyze-string 精确匹配(支持字面量,无需转义正则元字符) -->
        <xsl:apply-templates select="analyze-string(., $software?software-name?normalizedForm)" mode="wrap"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:next-match/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <!-- 包装匹配结果 -->
  <xsl:template mode="wrap" match="*:match">
    <software>{.}</software>
  </xsl:template>

  <!-- 默认浅拷贝所有未匹配节点 -->
  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
</xsl:stylesheet>

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

from saxonche import PySaxonProcessor

# 加载 XML 和 XSLT
xml_content = '''<root><p>The reliability of the model structure was tested using the ENERGY commands of MODELLER <ref type="bibr" target="#b45">(Sali and Blundell, 1993)</ref>. The modelled structures were also validated using the program PROSA <ref type="bibr" target="#b54">(Wiederstein and Sippl, 2007)</ref>.</p></root>'''

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 字段与 <p> 内纯文本拼接结果(string-join($p//text(), '')),确保仅在真实语境中触发标注,杜绝跨句误包。
  • 安全正则处理:analyze-string() 自动转义 normalizedForm 中的正则特殊字符(如 +, *, .),无需手动 re.escape()。
  • 多软件支持:xsl:iterate 可顺序处理 JSON 中全部软件条目;若多个软件共存于同一 <p>,将按 JSON 顺序依次包装(无嵌套冲突)。
  • 性能提示:对于超大 XML,建议将 JSON 预加载为变量(json-doc()),避免重复解析;生产环境推荐使用 Saxon-HE Java 版本以获得更优性能。
  • 扩展性:如需支持大小写不敏感匹配,可将 contains() 替换为 matches(., concat('.*', $software?software-name?normalizedForm, '.*'), 'i')。

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

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2035

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3002

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1016

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3399

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5839

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4304

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

5537

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2382

2024.11.28

PixPix官网入口合集
PixPix官网入口合集

本专题汇总了PixPix官网在线使用入口及平台功能详解,涵盖文生图、图生图、AI图片编辑、AI视频创作等核心能力,并整理了AI爆款图片复刻、商品套图、详情页生成、视频变清晰与去水印等电商专项工具的使用教程。同时收录了PixPix MCP接入Codex、Claude Code等主流Agent的操作指南,助您一站式完成AI图片与视频创作。

0

2026.10.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn