基于XSLT匹配CSV的IH_NO为HTML的span元素注入对应IH_TITLE
解决方案:XSLT匹配CSV数据填充HTML元素
核心思路
针对10万条量级的CSV数据,核心是通过将CSV转换为可索引的XML节点集,再利用XSLT的key机制实现快速匹配,彻底避免逐个IH_NO的条件判断,保证处理效率。
示例数据
CSV示例(test.csv)
IH_NO,IH_TITLE IH001,用户管理模块 IH002,订单查询功能 IH003,数据统计面板
原始HTML结构
<html> <body> <span id="ih-IH001"></span> <span id="ih-IH002"></span> <span id="ih-IH004"></span> </body> </html>
期望HTML结构
<html> <body> <span id="ih-IH001">用户管理模块</span> <span id="ih-IH002">订单查询功能</span> <span id="ih-IH004"></span> </body> </html>
正确XSLT代码(XSLT 2.0+,推荐用Saxon处理器)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 读取CSV文件并拆分成行 --> <xsl:variable name="csv-data" select="unparsed-text('test.csv', 'UTF-8')"/> <xsl:variable name="csv-rows" select="tokenize($csv-data, ' ')[position() > 1]"/> <!-- 创建索引键:以IH_NO为键,映射对应的IH_TITLE --> <xsl:key name="ih-title-map" match="row" use="@ih-no"/> <!-- 通用复制模板:保留HTML原有结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理目标span元素 --> <xsl:template match="span[starts-with(@id, 'ih-')]"> <xsl:copy> <xsl:apply-templates select="@*"/> <!-- 提取id中的IH_NO部分 --> <xsl:variable name="target-no" select="substring-after(@id, 'ih-')"/> <!-- 通过键快速查找匹配的标题 --> <xsl:value-of select="key('ih-title-map', $target-no)/@ih-title"/> </xsl:copy> </xsl:template> <!-- 解析CSV行生成XML节点 --> <xsl:variable name="csv-xml"> <xsl:for-each select="$csv-rows"> <xsl:if test="normalize-space(.)"> <xsl:variable name="fields" select="tokenize(., '(?<!"),(?!")')"/> <row ih-no="{normalize-space($fields[1])}" ih-title="{normalize-space($fields[2])}" /> </xsl:if> </xsl:for-each> </xsl:variable> </xsl:stylesheet>
关键细节说明
CSV解析逻辑
- 用
unparsed-text直接读取CSV文件,指定编码避免乱码 - 用
tokenize按行拆分,跳过表头行 - 处理带引号的字段:正则
(?<!"),(?!")匹配不在引号内的逗号,解决字段含逗号的场景
- 用
索引优化
- 用
xsl:key创建IH_NO到IH_TITLE的映射,查找时是O(1)时间复杂度,完美适配10万条数据的量级
- 用
Span匹配逻辑
- 精准匹配
id以ih-开头的span元素 - 提取
id中ih-后的IH_NO内容,通过索引键快速拉取对应标题,无匹配则保持空值
- 精准匹配
注意事项
- 必须使用支持XSLT 2.0及以上的处理器(如Saxon-HE),XSLT 1.0不支持
unparsed-text和原生tokenize - 若CSV存在空行,
normalize-space(.)会自动跳过,避免无效节点
内容的提问来源于stack exchange,提问作者ak5555
相关产品推荐
相关产品推荐

