如何使用XSLT从ASP生成的复杂HTML页面中筛选提取所需内容?
实现说明
结论
该需求完全可以通过XSLT实现,你提供的源HTML是标准XHTML格式,可直接被XSLT解析处理。
核心实现逻辑
- 首先在XSLT中声明与源文件对应的XHTML命名空间,避免节点匹配失效
- 以身份转换模板为基础,默认保留所有需要的节点与属性
- 过滤规则直接屏蔽不需要的内容:class为
nav的导航节点、class为about的介绍节点、ASP生成的隐藏节点、菜单、页面头部/页脚等无关内容 - 锚定
<p class="page-title">Library</p>为内容起点,提取该节点及之后所有符合要求的兄弟节点(包含所有脚注内容) - 如需批量合并多文件,可通过XSLT的
document()函数批量加载所有待处理HTML,依次处理后拼接输出为单个完整HTML文件
示例XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xhtml"> <!-- 输出配置:生成标准HTML --> <xsl:output method="html" indent="yes" encoding="UTF-8"/> <!-- 身份转换模板:默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配内容起点,处理后续所有符合要求的内容 --> <xsl:template match="xhtml:p[@class='page-title' and normalize-space(text())='Library']"> <!-- 复制当前标题节点 --> <xsl:copy-of select="."/> <!-- 处理后续兄弟节点,过滤导航和about内容 --> <xsl:apply-templates select="following-sibling::node()[ not(self::xhtml:div[@class='nav']) and not(self::xhtml:p[@class='about']) ]"/> </xsl:template> <!-- 根模板:构建输出HTML结构 --> <xsl:template match="/"> <html> <head> <title>合并书籍内容</title> </head> <body> <!-- 单文件处理逻辑,多文件可在此处循环调用document()加载所有待处理文件 --> <xsl:apply-templates select="//xhtml:p[@class='page-title' and normalize-space(text())='Library']"/> </body> </html> </xsl:template> </xsl:stylesheet>
多文件合并扩展
如果需要合并多个ASP生成的HTML文件,只需要修改根模板逻辑,将所有待处理文件路径存入列表,循环调用document(文件路径)加载并执行筛选逻辑,即可自动将所有文件的有效内容拼接为单个HTML文件。
内容的提问来源于stack exchange,提问作者Karsten
相关产品推荐
相关产品推荐

