Orbeon Forms技术咨询:新手如何在Action中使用XPath
在Orbeon Forms的Action中正确使用XPath
先拆解你代码里的几个问题,再给你正确的写法:
- Action元素的选择:你用了带
type="xpath"的<xf:action>,但Orbeon里更推荐用<xf:script>执行XPath脚本,或者用标准XForms的<xf:action>结合动作元素(比如<xf:var>、<xf:setvalue>)实现逻辑。 - 变量定义语法:XPath里定义变量不能用
var,要么用XForms的<xf:var>,要么在XPath脚本里用let 变量名 := 值的格式。 - 条件表达式错误:
xf:if是错误写法,XPath的条件判断是if (条件) then ... else ...,不需要加xf:前缀;另外你else分支的/SystemResult =mySysResult = 'false'逻辑混乱,属于无效的比较表达式,应该直接指定赋值目标值。 - 赋值 vs 比较:你原代码里的
/SystemResult = mySysResult是比较操作,不是赋值。如果要修改/SystemResult节点的值,得用<xf:setvalue>或者XPath的fn:set-value函数。
正确写法一:用XForms标准Action结构
这种写法更符合XForms规范,可读性更强:
<xf:action observer="GetURL-control" event="DOMActivate"> <!-- 定义变量mySysResult --> <xf:var name="mySysResult" value="'true'"/> <!-- 根据变量值给/SystemResult赋值 --> <xf:setvalue ref="/SystemResult" value="if ($mySysResult = 'true') then 'true' else 'false'"/> </xf:action>
正确写法二:用XPath脚本(xf:script)
如果习惯用纯XPath逻辑,可以用<xf:script>:
<xf:script observer="GetURL-control" event="DOMActivate"> let mySysResult := 'true' return if (mySysResult = 'true') then fn:set-value(/SystemResult, 'true') else fn:set-value(/SystemResult, 'false') </xf:script>
关键注意点
- 引用变量时要加
$前缀(比如$mySysResult)。 - 字符串值要加单引号,比如
'true'。 - 如果只是简单的布尔值判断,其实可以简化逻辑:直接把
$mySysResult赋值给/SystemResult,因为它本身就是'true'或'false',不需要额外的if判断——这部分可以根据你的实际需求调整。
内容的提问来源于stack exchange,提问作者Pete Atkin
相关产品推荐
相关产品推荐

