如何使用XPath从字符串中提取两个数字
当然有靠谱的解决方案!根据你的Schematron环境支持的XPath版本,有两种常用的处理方式:
方案1:XPath 2.0及以上版本(推荐)
XPath 2.0+自带的tokenize()函数可以轻松按分隔符拆分字符串,完美适配这种宽x高格式的分辨率:
- 提取宽度(第一个数字):
tokenize(//resolution/text(), 'x')[1] cast as xs:integer? - 提取高度(第二个数字):
tokenize(//resolution/text(), 'x')[2] cast as xs:integer?
简单解释:tokenize()会把分辨率文本按x分割成一个字符串序列,[1]和[2]分别取序列里的第一个、第二个元素,cast as xs:integer?则把字符串转换为整数(末尾的?是为了在转换失败时返回空值,避免直接报错)。
方案2:兼容XPath 1.0的方案
如果你的Schematron环境只支持XPath 1.0,也可以用基础字符串函数组合实现:
- 提取宽度:
number(substring-before(//resolution/text(), 'x')) - 提取高度:
number(substring-after(//resolution/text(), 'x'))
这里substring-before()用来获取x之前的宽度字符串,substring-after()获取x之后的高度字符串,再用number()把它们转换成数值类型。
在Schematron中实际使用示例
比如你想验证分辨率是否符合1920x1080及以上的要求,可以写这样的规则:
<sch:pattern> <sch:rule context="resolution"> <sch:assert test="number(substring-before(text(), 'x')) >= 1920"> 宽度必须至少为1920,当前值为<sch:value-of select="substring-before(text(), 'x')"/> </sch:assert> <sch:assert test="number(substring-after(text(), 'x')) >= 1080"> 高度必须至少为1080,当前值为<sch:value-of select="substring-after(text(), 'x')"/> </sch:assert> </sch:rule> </sch:pattern>
如果是XPath 2.0环境,直接把断言里的表达式替换成tokenize()版本的写法就可以了。
内容的提问来源于stack exchange,提问作者Adam1212
相关产品推荐
相关产品推荐

