如何用XPath 3.1获取HTML5浏览器解析后的colspan属性值?
用XPath 3.1实现符合HTML5规范的colspan取值
要让XPath获取的<td>元素colspan值和HTML5浏览器解析结果完全一致,得严格照着HTML5的属性解析规则来写表达式。下面是具体实现和说明:
最终XPath表达式
for $td in //td return let $last_colspan := $td/@colspan[last()] let $clean_val := normalize-space($last_colspan) return if (empty($clean_val) or not(matches($clean_val, '^\d+$'))) then 1 else max((xs:integer($clean_val), 1))
逻辑对应HTML5解析规则
每一步都贴合浏览器的处理逻辑:
- 处理重复属性:
$td/@colspan[last()]取最后一个colspan属性——浏览器碰到重复属性时,只会保留最后一个,前置的重复属性会被忽略。 - 清理空白字符:
normalize-space($last_colspan)去掉属性值前后的空格;如果元素没有colspan属性,这一步会得到空字符串。 - 校验合法格式:
matches($clean_val, '^\d+$')检查是否为纯十进制数字串——像你遇到的"2e1",因为包含非数字字符e,会被判定为无效格式。 - 兜底有效值:
- 若属性不存在、值为空或格式无效,直接返回默认值
1; - 就算是纯数字但数值小于1(比如
"0"),也强制返回1,因为HTML5规定colspan必须≥1。
- 若属性不存在、值为空或格式无效,直接返回默认值
场景测试示例
针对不同情况的取值结果:
- 无
colspan属性的<td>:返回1 <td colspan=" 4 ">:返回4`<td colspan="2e1">:返回1`(符合浏览器解析逻辑)<td colspan="0">:返回1`<td colspan="3" colspan="5">:返回5`(取最后一个属性值)
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

