Mendix 中的XPath 令牌(XPath Tokens)详解
在 Mendix 中,XPath 令牌(XPath Tokens) 是一种特殊的动态参数化查询技术,允许你在 XPath 表达式中使用变量或上下文相关的值,从而实现更灵活的查询逻辑。
1. 什么是 XPath 令牌?
XPath 令牌是 Mendix 提供的一种机制,用于在 XPath 查询中动态插入值。它们以 [%TokenName%]
的格式表示,在运行时会被替换为实际的值。
核心作用:
- 避免硬编码,增强查询的灵活性。
- 支持基于用户输入、当前会话或系统状态的动态过滤。
2. 常用 XPath 令牌类型
Mendix 内置了多种令牌,覆盖常见场景:
令牌 | 说明 | 示例 |
---|---|---|
[%CurrentUser%] | 当前登录用户的 System.User 对象。 | [SalesRep = [%CurrentUser%]] |
[%CurrentUserRoles%] | 当前用户的所有角色(需结合关联查询)。 | [Module.Role/Name = [%CurrentUserRoles%]] |
[%CurrentDateTime%] | 当前系统时间(格式:yyyy-MM-dd HH:mm:ss )。 | [OrderDate > [%CurrentDateTime%]] |
[%ObjectParameter%] | 微流参数中的对象(需在微流中传入)。 | [Customer = [%ObjectParameter%]] |
[%AttributeParameter%] | 微流参数中的属性值(如字符串、数字)。 | [Price > [%AttributeParameter%]] |
[%SessionVariables%] | 会话变量(需提前在 After Startup 微流中设置)。 | [Region = [%SessionVariables.Region%]] |
3. 如何使用 XPath 令牌?
场景 1:查询当前用户的订单
XPath 表达式:
//Sales.Order[SalesRep = [%CurrentUser%]]
- 运行时,
[%CurrentUser%]
会被替换为当前用户的System.User
对象。
场景 2:动态过滤日期
XPath 表达式:
//Sales.Order[DeliveryDate > [%CurrentDateTime%]]
- 查询所有未交付(交付日期大于当前时间)的订单。
场景 3:结合微流参数
- 微流参数:定义一个名为
$minPrice
的数字参数。 - XPath 表达式:
//Sales.Product[Price > [%AttributeParameter%]]
- 配置:在
Retrieve
动作中,将AttributeParameter
绑定到$minPrice
。
4. 高级用法
自定义令牌
通过 Java 代码扩展自定义令牌:
- 实现
IXPathTokenProvider
接口。 - 注册到
Core.addXPathTokenProvider()
。 - 在 XPath 中使用
[%CustomToken%]
。
令牌与关联查询
结合关联路径使用令牌:
//Sales.Order[Sales.Customer/Sales.Customer/Region = [%SessionVariables.Region%]]
5. 注意事项
- 性能:令牌在运行时解析,复杂表达式可能影响性能。
- 空值处理:确保令牌替换后的值不为空(如
[%CurrentUser%]
在未登录时为null
)。 - 调试:在日志中检查最终生成的 XPath(需启用调试模式)。
6. 示例:完整微流流程
目标:查询当前用户所属区域的高价订单。
- 设置会话变量:在用户登录时存储
Region
到[%SessionVariables.Region%]
。 - XPath 表达式:
//Sales.Order[Sales.Customer/Sales.Customer/Region = [%SessionVariables.Region%] and TotalAmount > 1000 ]
- 结果:动态返回符合条件的数据。