如何在XProc中将XPath返回值存入变量?解决Calabash执行报错
解决XProc中使用
<p:variable>存储XPath值时的Calabash报错问题 错误原因
你遇到的报错翻译为:无法调用"String.startsWith(String)",因为"lexicalQName"为null。
核心原因是<p:variable>元素缺少必填的name属性——XProc要求每个变量必须有明确的名称,否则处理器无法识别变量标识,进而触发空指针异常。同时原代码还缺少XProc流程必需的根节点<p:declare-step>,且未显式关联变量的数据源上下文。
修正后的代码
input.xml(无需修改)
<root> <element id="test"/> </root>
修正后的test.xpl
<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" version="1.0"> <!-- 加载源文档并命名,用于后续关联数据源 --> <p:load name="load-source-document" href="input.xml"/> <!-- 定义变量:指定name属性,关联数据源并执行XPath查询 --> <p:variable name="target-id" select="/root/element/@id" source="load-source-document"/> <!-- 可选:输出变量值,验证结果是否正确 --> <p:identity> <p:input port="source"> <p:inline> <result> <id-value>{$target-id}</id-value> </result> </p:inline> </p:input> </p:identity> </p:declare-step>
关键修改说明
- 给
<p:variable>添加name="target-id"属性,明确变量名称,这是解决报错的核心。 - 通过
source="load-source-document"将变量绑定到加载的文档,确保XPath查询有正确的上下文。 - 补充
<p:declare-step>根元素,这是XProc流程的必需结构。 - 新增
<p:identity>步骤用于输出变量值,方便验证结果。
执行验证
用Calabash执行修正后的test.xpl,会输出如下结果,证明变量已正确获取到属性值:
<result> <id-value>test</id-value> </result>
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

