
本文介绍一种基于 XSLT 1.0 的可靠方案,用于从复杂 XHTML 中精准定位 div[@id='key_div'] 内自 起的后续内容,将其转换为精简 HTML:将 替换为 ,重写所有 /some/old/... 链接为 /new/...,并剔除无关节点。
本文介绍一种基于 xslt 1.0 的可靠方案,用于从复杂 xhtml 中精准定位 `div[@id='key_div']` 内自 `
` 起的后续内容,将其转换为精简 HTML:将 `` 替换为 ``,重写所有 `/some/old/...` 链接为 `/new/...`,并剔除无关节点。
`,重写所有 `/some/old/...` 链接为 `/new/...`,并剔除无关节点。
要实现目标效果,关键在于改变匹配策略:不再通配 div[@id='key_div']/*,而是*主动定位 <h2></h2> 节点,并仅处理其自身及后续兄弟元素(`following-sibling::`)**。这从根本上解决了“无法跳过前面冗余内容”的问题。
以下是完整、可直接运行的 XSLT 1.0 样例:
<stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><!-- 匹配根 html 元素,构建新文档结构 --><template match="/html"><title>My Title</title>
<!-- 此处可添加自定义 meta、CSS 等 --><!-- 精准定位 key_div 下的第一个 h2,并触发其模板 --><apply-templates select="//div[@id='key_div']/h2"></apply-templates></template><!-- 处理 h2:转为 h1,输出文本内容,并继续处理后续兄弟元素 --><template match="h2"><h1>
<value-of select="."></value-of>
</h1>
<!-- 关键:只处理 h2 之后的同级元素(p、ul、div 等),跳过前面所有 -->
<apply-templates select="following-sibling::*"></apply-templates></template><!-- 专门处理 href 属性:将 /some/old/xxx 替换为 /new/xxx --><template match="@href"><attribute name="href"><text>/new/</text><value-of select="substring-after(., '/old/')"></value-of></attribute></template><!-- 默认身份拷贝模板(identity template):安全复制所有其他节点和属性 --><template match="@*|node()"><copy><apply-templates select="@*|node()"></apply-templates></copy></template></stylesheet>
✅ 核心要点说明:
-
//div[@id='key_div']/h2使用绝对路径确保只抓取目标<h2></h2>,避免误匹配; -
following-sibling::*是实现“从<h2></h2>开始截取”的核心机制,天然排除其前所有兄弟节点(如无用的<p></p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill4293" title="Doc To HTML"><img src="https://img.php.cn/upload/skill/000/000/081/178998486916110.jpg" alt="Doc To HTML" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill4293" title="Doc To HTML" class="overflowclass">Doc To HTML</a> <p class="overflowclass">使用 MinerU 文档处理引擎将 Word 文档(.doc、.docx)转换为保留结构和格式的干净 HTML。</p> </div> <a rel="nofollow" href="/xiazai/skill4293" title="Doc To HTML" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>); -
@href模板独立处理链接属性,substring-after(., '/old/')稳健提取路径后缀,即使原始href含查询参数(如/some/old/path?ref=1)也能正确保留; - 最后的 identity template 保证其余结构(如
<p></p>、<ul></ul>、文本节点等)原样保留,同时允许其他自定义模板(如后续需处理<img>或<table>)无缝插入。<p>⚠️ <strong>注意事项:</strong> </p> <ul> <li>若 XHTML 文档声明了命名空间(如 <code>xmlns="http://www.w3.org/1999/xhtml"),需在 XSLT 中添加xpath-default-namespace或使用带前缀的匹配(如x:h2),否则//div[@id='key_div']/h2将不匹配; -
substring-after(., '/old/')假设所有需替换的链接均含/old/子串;若存在多种旧路径模式(如/legacy/,/v1/),建议改用xsl:choose或升级至 XSLT 2.0+ 的replace()函数; - 本方案默认忽略注释节点(
<!-- ... -->)——如需保留,请额外添加<template match="comment()"><copy></copy></template>。
该方案结构清晰、扩展性强,后续可轻松叠加其他转换逻辑(例如统一图片域名、移除特定 class、标准化空格等),是处理网页片段抽取与重构的工业级实践范式。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










