如何在XPath查询中动态处理带数字前缀的产品节点获取描述
直接在XPath中动态处理带数字前缀的产品编码查询
先看你给出的产品XML结构——每个产品对应一个以编码命名的子节点,数字开头的编码会被自动添加下划线前缀:
<products> <C8TJM> <code>C8TJM</code> <name>Product</name> <description>Product description</description> </C8TJM> <D75KF> <code>D75KF</code> <name>Product</name> <description>Product description</description> </D75KF> <_89TJX> <code>89TJX</code> <name>Product</name> <description>Product description</description> </_89TJX> </products>
你的需求是不用额外定义变量,直接在XPath里完成「判断编码是否以数字开头→按需加下划线前缀→定位节点取description」的完整逻辑,我来给你两种适配不同XSLT版本的写法:
适配XSLT 2.0+的写法
直接用XPath的if表达式嵌入判断逻辑,写法更直观:
/products/*[local-name() = (if (contains('0123456789', substring($productCode, 1, 1))) then concat('_', $productCode) else $productCode)]/description/text()
逻辑拆解:
contains('0123456789', substring($productCode, 1, 1)):检查产品编码首字符是否为数字- 用
if/else动态生成带前缀(如果需要)的节点名称 - 通过
local-name()匹配对应的产品节点,最终取出description的文本内容
适配XSLT 1.0的写法
因为XSLT 1.0不支持if表达式,我们可以用字符串拼接的技巧实现相同效果:
/products/*[local-name() = concat( substring('_', 1, number(contains('0123456789', substring($productCode, 1, 1)))), $productCode )]/description/text()
逻辑拆解:
number(contains(...))会返回1(条件成立,首字符是数字)或0(条件不成立)- 当条件成立时,
substring('_',1,1)会取出下划线;不成立时取空字符串 - 最终拼接出正确的节点名称,完成匹配和内容提取
内容的提问来源于stack exchange,提问作者Cosmin
相关产品推荐
相关产品推荐

