Saxon 9.8环境下XSLT的for-each循环空转不执行逻辑问题
问题核心场景
- 项目背景:参与NLP项目开发,核心需求为从标注语料中提取句法依存关系
- 调试环境:使用Saxon 9.8作为XSLT处理器编写、调试转换逻辑
- 异常表现:用于提取SUB类依存关系的核心逻辑本身无语法错误,但执行流会在匹配
//item节点的模板入口、模板内部的for-each语句之间来回跳转,for-each包裹的内部业务逻辑完全不执行 - 已排查的初步猜想:
current()函数取值异常- Saxon 9.8处理器的特殊执行行为
- 自身编写的XSLT代码存在逻辑漏洞
- 初步定位方向:怀疑是当前节点取值为空,导致
for-each遍历的节点集合为空,循环逻辑无法正常触发;目前尚未定位到根因,计划结合配套的XML样本、完整XSLT代码进一步排查
常见问题诱因与排查方法
- 临时改写
for-each的select表达式为硬编码的可正常访问的测试节点路径,将循环内部逻辑替换为简单的节点值输出语句,验证循环是否能正常进入,快速排除隐式上下文传递异常导致的选点为空问题 - 适配Saxon 9.8的执行规则:该版本对XSLT的节点上下文校验逻辑更为严格,当
for-each的select表达式依赖未被正确传递的隐式上下文节点时,会直接返回空节点集,不会抛出明确的执行报错,容易造成“执行流停在循环入口但不进入内部逻辑”的表象 - 厘清
current()函数的作用域:current()返回的是当前模板匹配的上下文根节点,并非for-each循环的当前遍历项节点,两者作用域完全隔离,若在for-each的select表达式中嵌套使用current()引用目标节点,极易出现上下文错位,最终得到空的遍历集合
内容的提问来源于stack exchange,提问作者Etienne Armangau
相关产品推荐
相关产品推荐

