2.3. FEEL 中的规则表达式


友好的 Enough Expression Language (FEEL)是对象管理组(OMG) DMN 规范定义的表达式语言。FEEL 表达式在 DMN 模型中定义决策的逻辑。FEEL 旨在通过为决策模型结构分配语义来促进决策模型和执行。决策要求图(DRD) occupy 表单元中的 FEEL 表达式是决策节点和业务知识模型的方框表达式。

有关 DMN 中的 FEEL 的更多信息,请参阅 OMG Decision Model 和 Notation 规格

2.3.1. FEEL 中的数据类型

友好的 Enough Expression Language (FEEL)支持以下数据类型:

  • number
  • 字符串
  • 布尔值
  • 日期
  • Time
  • 日期和时间
  • 天数和持续时间
  • 年和月持续时间
  • Functions
  • context
  • 范围(或间隔)
  • list
注意

DMN 规格目前不提供将变量声明为 函数上下文、范围或 列表的 显式方法,但 Red Hat Process Automation Manager 扩展了 DMN 内置类型来支持这些类型的变量。

以下列表描述了每种数据类型:

number

FEEL 中的数字基于 IEEE 754-2008 Decimal 128 格式,其 34 位数字精度。在内部,数字在 Java 中以 MathContext DECIMAL128 的形式表示。 https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.htmlFEEL 只支持一个数字数据类型,因此同一类型用于表示整数和浮动点号。

FEEL 号使用点(.)作为十进制分隔符。FEEL 不支持 -INF+INFNaN。FEEL 使用 null 来代表无效数字。

Red Hat Process Automation Manager 扩展 DMN 规格并支持额外的数字表示法:

  • Scientific : 您可以使用带有后缀 e<exp>E<exp> 的 Scientific 表示法。例如,1.2e3 与编写表达式 1.239)101143 相同,但是一个字面而不是表达式。
  • 十六进制 :您可以使用前缀为 0x 的十六进制数字。例如,0xff 与十进制数字 255 相同。支持大写字母和小写字母。例如,0XFF0xff 相同。
  • 类型后缀: 您可以使用类型后缀 fFdDlL。这些后缀将被忽略。
字符串

FEEL 中的字符串是以双引号分隔的任何字符序列。

示例

"John Doe"
Copy to Clipboard Toggle word wrap

布尔值
FEEL 使用三值布尔值逻辑,因此布尔值逻辑表达式可能的值为 truefalsenull
日期

FEEL 不支持日期字面,但您可以使用内置 date () 函数来构建日期值。FEEL 中的日期字符串遵循 XML 架构第 2 部分中定义的格式:Datatypes 文档。格式为 "YYYY-MM-DD",其中 YYYY 是四位,MM 是带有两位数字的月份,DD 是一天的数量。

例如:

date( "2017-06-23" )
Copy to Clipboard Toggle word wrap

日期对象的时间等于 "00:00:00",即午夜。日期被视为本地,没有时区。

Time

FEEL 不支持时间字面,但您可以使用内置 time () 函数来构建时间值。FEEL 中的时间字符串遵循 XML 架构第 2 部分中定义的格式:Datatypes 文档。格式为 "hh:mm:ss[.uu][(+-) hh:mm]",其中 hh 是一天的小时(从 0023),mm 是小时中的分钟,sss 是分钟(以分钟为单位)。(可选)字符串可以在第二个时间段内定义毫秒数(uu),并从 UTC 时间包含一个正数(+)或负数(-)偏移量以定义其时区。您可以使用字母 z 表示 UTC 时间,而不必使用偏移值 -00:00。如果没有定义偏移量,则时间被视为 local。

示例:

time( "04:25:12" )
time( "14:10:00+02:00" )
time( "22:35:40.345-05:00" )
time( "15:00:30z" )
Copy to Clipboard Toggle word wrap

定义偏移或时区的时间值不能与未定义偏移或时区的本地时间进行比较。

日期和时间

FEEL 不支持日期和时间字面,但您可以使用内置 日期和时间 () 函数来构建日期和时间值。FEEL 中的日期和时间字符串遵循 XML 架构第 2 部分定义的格式:Datatypes 文档。格式为 "< date>T<time>",其中 <date & gt; 和 <time > 遵循预先发布的 XML 模式格式,由 T 共存。

示例:

date and time( "2017-10-22T23:59:00" )
date and time( "2017-06-13T14:10:00+02:00" )
date and time( "2017-02-05T22:35:40.345-05:00" )
date and time( "2017-06-13T15:00:30z" )
Copy to Clipboard Toggle word wrap

定义偏移或时区的日期和时间值不能与不定义偏移或时区的本地日期和时间值进行比较。

重要

如果您的 DMN 规范的实现不支持 XML 模式中的空格,请使用关键字 dateTime 作为 日期和时间

天数和持续时间

FEEL 不支持天数和持续时间字面,但您可以使用内置 duration () 函数来构建天数和持续时间值。FEEL 中的天数和持续时间字符串遵循 XML 架构第 2 部分中定义的格式:Datatypes 文档,但仅限于天数、小时、分钟和秒。不支持月和年。

示例:

duration( "P1DT23H12M30S" )
duration( "P23D" )
duration( "PT12H" )
duration( "PT35M" )
Copy to Clipboard Toggle word wrap
重要

如果您的 DMN 规范的实现不支持 XML 模式中的空格,请使用关键字 dayTimeDuration 作为 天数和持续时间的组合

年和月持续时间

FEEL 不支持年和月持续时间字面,但您可以使用内置 duration () 函数来构建天数和持续时间值。FEEL 中的年和月持续时间字符串遵循 XML 架构第 2 部分定义的格式:Datatypes 文档,但仅限于年和月。不支持天数、小时、分钟或秒。

示例:

duration( "P3Y5M" )
duration( "P2Y" )
duration( "P10M" )
duration( "P25M" )
Copy to Clipboard Toggle word wrap
重要

如果您的 DMN 规范的实现不支持 XML 模式中的空格,请使用关键字 yearMonthDuration 作为 年和月持续时间

Functions

FEEL 具有可用于创建功能的功能字面(或匿名功能)。DMN 规格目前不提供将变量声明为 函数的 显式方法,但 Red Hat Process Automation Manager 扩展了 DMN 内置类型来支持函数的变量。

例如:

function(a, b) a + b
Copy to Clipboard Toggle word wrap

在本例中,FEEL 表达式会创建一个添加参数 ab 且返回结果的功能。

context

FEEL 具有可用于创建上下文的上下文字面。FEEL 中的 上下文是 键和值对列表,类似于 Java 等语言的映射。DMN 规格目前不提供将变量声明为 上下文 的显式方法,但 Red Hat Process Automation Manager 扩展了 DMN 内置类型来支持上下文变量。

例如:

{ x : 5, y : 3 }
Copy to Clipboard Toggle word wrap

在本例中,表达式会创建一个带有两个条目 xy 的上下文,代表图表中的协调。

在 DMN 1.2 中,创建上下文的另一种方法是创建一个项目定义,它将键列表作为属性组成,然后将变量声明为具有该项目定义类型。

Red Hat Process Automation Manager DMN API 支持以两种方式表示的 DMN the Definition structural 类型:

  • 用户定义的 Java 类型:必须是有效的 IaaS 对象,定义属性,并为 DMN114 Definition 中的每个组件获取。如果需要,您也可以对代表组件名称的 getters 使用 @FEELProperty 注释,这会导致 Java 标识符无效。
  • java.util.Map 接口:映射需要定义适当的条目,其键与 DMN114 Definition 中的组件名称对应
范围(或间隔)

FEEL 具有 范围 字面,您可以使用它来创建范围或间隔。FEEL 中 的范围是 一个值,它定义了较低和上限,其中可以是打开或关闭。DMN 规格目前不提供将变量声明为 范围的 显式方法,但 Red Hat Process Automation Manager 扩展了 DMN 内置类型来支持范围的变量。

范围的语法采用以下格式定义:

range          := interval_start endpoint '..' endpoint interval_end
interval_start := open_start | closed_start
open_start     := '(' | ']'
closed_start   := '['
interval_end   := open_end | closed_end
open_end       := ')' | '['
closed_end     := ']'
endpoint       := expression
Copy to Clipboard Toggle word wrap

端点的表达式必须返回类似值,下限端点必须低于上限的端点。

例如,以下字面表达式定义了 110 之间的间隔,包括边界(两个端点关闭间隔):

[ 1 .. 10 ]
Copy to Clipboard Toggle word wrap

以下字面表达式定义了 1 小时到 12 小时之间的间隔,包括下限(关闭间隔),但排除上限边界(开放间隔):

[ duration("PT1H") .. duration("PT12H") )
Copy to Clipboard Toggle word wrap

您可以使用决策表中的范围来测试值范围,或者在简单的字面表达式中使用范围。例如,如果变量 x 的值介于 0100 之间,则以下字面表达式返回 true

x in [ 1 .. 100 ]
Copy to Clipboard Toggle word wrap
list

FEEL 具有 列出 可用于创建项目列表的字面点。FEEL 的列表 由用逗号分开的值列表表示,用方括号括起。DMN 规格目前不提供将变量声明为 列表的 显式方法,但 Red Hat Process Automation Manager 扩展了 DMN 内置类型来支持列表的变量。

例如:

[ 2, 3, 4, 5 ]
Copy to Clipboard Toggle word wrap

FEEL 中的所有列表都包含相同类型和不可变的元素。列表中的元素可以被索引访问,其中第一个元素为 1。负索引可以访问从列表末尾开始的元素,以便 -1 是最后一个元素。

例如,以下表达式返回列表 x 的第二个元素:

x[2]
Copy to Clipboard Toggle word wrap

以下表达式返回列表 x 的 second-to-last 元素:

x[-2]
Copy to Clipboard Toggle word wrap

列表中的元素也可以通过函数 来计算,该函数使用元素列表作为参数。

例如,以下表达式返回 4

count([ 2, 3, 4, 5 ])
Copy to Clipboard Toggle word wrap

2.3.2. FEEL 中的内置功能

为提升与其他平台和系统的互操作性,FEEL 包含了内置的函数库。内置的 FEEL 功能在 dros Decision Model and Notation (DMN)引擎中实施,以便您在 DMN 决策服务中使用功能。

以下小节描述了每个内置的 FEEL 功能,格式为 NAME( PARAMETERS )。有关 DMN 中的 FEEL 功能的更多信息,请参阅 OMG Decision Model 和 Notation 规格

2.3.2.1. 转换功能

以下功能支持在不同类型值之间进行转换。其中一些功能使用特定的字符串格式,如以下示例:

date( from ) - using date

从一个 日期 值转换。

Expand
表 2.3. å�‚æ•°
�数类�格�

from

字符串

日期字符串

示例

date( "2012-12-25" ) - date( "2012-12-24" ) = duration( "P1D" )
Copy to Clipboard Toggle word wrap

date (from)- 使用日期和时间

日期值转换到 日期 值,并将时间组件设置为 null。

Expand
表 2.4. å�‚æ•°
�数类�

from

日期和时间

示例

date(date and time( "2012-12-25T11:00:00Z" )) = date( "2012-12-25" )
Copy to Clipboard Toggle word wrap

date (year, month, day)

从指定的年、月份 和日期 值生成日期。

Expand
表 2.5. å�‚æ•°
�数类�

year

number

month

number

day

number

示例

date( 2012, 12, 25 ) = date( "2012-12-25" )
Copy to Clipboard Toggle word wrap

date and time( date, time )

从指定 日期 生成日期和时间,并忽略任何时间组件和指定时间。

Expand
表 2.6. å�‚æ•°
�数类�

date

日期和时间

time

time

示例

date and time ( "2012-12-24T23:59:00" ) = date and time(date( "2012-12-24" ), time( "23:59:00" ))
Copy to Clipboard Toggle word wrap

日期和时间(from)

从指定的字符串生成 日期和时间

Expand
表 2.7. å�‚æ•°
�数类�格�

from

字符串

日期日期字符串

示例

date and time( "2012-12-24T23:59:00" ) + duration( "PT1M" ) = date and time( "2012-12-25T00:00:00" )
Copy to Clipboard Toggle word wrap

time( from )

从指定的字符串生成 时间

Expand
表 2.8. å�‚æ•°
�数类�格�

from

字符串

时间字符串

示例

time( "23:59:00z" ) + duration( "PT2M" ) = time( "00:01:00@Etc/UTC" )
Copy to Clipboard Toggle word wrap

time( from )

从指定参数生成 时间,并忽略任何日期组件。

Expand
表 2.9. å�‚æ•°
�数类�

from

时间和日期

示例

time(date and time( "2012-12-25T11:00:00Z" )) = time( "11:00:00Z" )
Copy to Clipboard Toggle word wrap

time (hour, minute, second, offset?)

从指定小时、分钟和第二组件值生成时间。

Expand
表 2.10. å�‚æ•°
�数类�

hour

number

minute

number

second

number

offset (可选)

天数和持续时间 或 null

示例

time( "23:59:00z" ) = time(23, 59, 0, duration( "PT0H" ))
Copy to Clipboard Toggle word wrap

number (from, grouping separator, decimal separator)

使用指定的分隔符 转换为 数字

Expand
表 2.11. å�‚æ•°
�数类�

from

代表有效数字的字符串

分组分隔符

空格()、逗号()、句点(.)或 null

十进制分隔符

类型与 分组分隔符 相同,但值不能匹配

示例

number( "1 000,0", " ", "," ) = number( "1,000.0", ",", "." )
Copy to Clipboard Toggle word wrap

string( from )

提供指定参数的字符串表示。

Expand
表 2.12. å�‚æ•°
�数类�

from

非空值

例�

string( 1.1 ) = "1.1"
string( null ) = null
Copy to Clipboard Toggle word wrap

duration( from )

几天和持续时间值或 年和 月持续时间 值转换。

Expand
表 2.13. å�‚æ•°
�数类�格�

from

字符串

持续时间字符串

例�

date and time( "2012-12-24T23:59:00" ) - date and time( "2012-12-22T03:45:00" ) = duration( "P2DT20H14M" )
duration( "P2Y2M" ) = duration( "P26M" )
Copy to Clipboard Toggle word wrap

年和月的持续时间(从、到 )

计算两个指定参数之间的 年和月持续时间

Expand
表 2.14. å�‚æ•°
�数类�

from

日期和时间

to

日期和时间

示例

years and months duration( date( "2011-12-22" ), date( "2013-08-24" ) ) = duration( "P1Y8M" )
Copy to Clipboard Toggle word wrap

2.3.2.2. 布尔值功能

以下功能支持布尔值操作。

not( negand )

执行 negand 操作对象的逻辑负部分。

Expand
表 2.15. å�‚æ•°
�数类�

negand

布尔值

例�

not( true ) = false
not( null ) = null
Copy to Clipboard Toggle word wrap

2.3.2.3. 字符串函数

以下功能支持字符串操作。

注意

在 FEEL 中,Unicode 字符根据其代码点进行计算。

substring (string, start position, length?)

从指定长度的起始位置返回子字符串。第一个字符位于位置值 1

Expand
表 2.16. å�‚æ•°
�数类�

字符串

字符串

启动位置

number

长度 (可选)

number

例子

substring( "testing",3 ) = "sting"
substring( "testing",3,3 ) = "sti"
substring( "testing", -2, 1 ) = "n"
substring( "\U01F40Eab", 2 ) = "ab"
Copy to Clipboard Toggle word wrap

注意

在 FEEL 中,字符串字面为 "\U01F40Eab"Evolutionab 字符串(horse 符号后跟 ab)。

string length( string )

计算指定字符串的长度。

Expand
表 2.17. å�‚æ•°
�数类�

字符串

字符串

例�

string length( "tes" ) = 3
string length( "\U01F40Eab" ) = 3
Copy to Clipboard Toggle word wrap

upper case( string )

生成指定字符串的大写版本。

Expand
表 2.18. å�‚æ•°
�数类�

字符串

字符串

示例

upper case( "aBc4" ) = "ABC4"
Copy to Clipboard Toggle word wrap

lower case( string )

生成指定字符串的小写版本。

Expand
表 2.19. å�‚æ•°
�数类�

字符串

字符串

示例

lower case( "aBc4" ) = "abc4"
Copy to Clipboard Toggle word wrap

substring before( string, match )

计算匹配项前的子字符串。

Expand
表 2.20. å�‚æ•°
�数类�

字符串

字符串

match

字符串

例�

substring before( "testing", "ing" ) = "test"
substring before( "testing", "xyz" ) = ""
Copy to Clipboard Toggle word wrap

substring after( string, match )

在匹配项后计算子字符串。

Expand
表 2.21. å�‚æ•°
�数类�

字符串

字符串

match

字符串

例�

substring after( "testing", "test" ) = "ing"
substring after( "", "a" ) = ""
Copy to Clipboard Toggle word wrap

replace (input, pattern, replacement, flags?)

计算正则表达式替换。

Expand
表 2.22. å�‚æ•°
�数类�

输入

字符串

pattern

字符串

替换

字符串

标记 (可选)

字符串

注意

此功能使用 XQuery 1.0 和 XPath 2.0 功能和 Operator 中定义的正则表达式参数。

示例

replace( "abcd", "(ab)|(a)", "[1=$1][2=$2]" ) = "[1=ab][2=]cd"
Copy to Clipboard Toggle word wrap

contains (string, match)

如果字符串包含匹配项,则返回 true

Expand
表 2.23. å�‚æ•°
�数类�

字符串

字符串

match

字符串

示例

contains( "testing", "to" ) = false
Copy to Clipboard Toggle word wrap

starting with (string, match)

如果字符串以匹配项开头,则返回 true

Expand
表 2.24. å�‚æ•°
�数类�

字符串

字符串

match

字符串

示例

starts with( "testing", "te" ) = true
Copy to Clipboard Toggle word wrap

end with (string, match)

如果字符串以匹配项结尾,则返回 true

Expand
表 2.25. å�‚æ•°
�数类�

字符串

字符串

match

字符串

示例

ends with( "testing", "g" ) = true
Copy to Clipboard Toggle word wrap

match (input, pattern, flags?)

如果输入与正则表达式匹配,则返回 true

Expand
表 2.26. å�‚æ•°
�数类�

输入

字符串

pattern

字符串

标记 (可选)

字符串

注意

此功能使用 XQuery 1.0 和 XPath 2.0 功能和 Operator 中定义的正则表达式参数。

示例

matches( "teeesting", "^te*sting" ) = true
Copy to Clipboard Toggle word wrap

split( string, delimiter )

返回原始字符串的列表,并将它分成分隔符正则表达式模式。

Expand
表 2.27. å�‚æ•°
�数类�

字符串

字符串

delimiter

正则表达式模式的字符串

注意

此功能使用 XQuery 1.0 和 XPath 2.0 功能和 Operator 中定义的正则表达式参数。

例�

split( "John Doe", "\\s" ) = ["John", "Doe"]
split( "a;b;c;;", ";" ) = ["a","b","c","",""]
Copy to Clipboard Toggle word wrap

2.3.2.4. 列出功能

以下功能支持列表操作。

注意

在 FEEL 中,列表中的第一个元素的索引是 1。列表中最后一个元素的索引可以识别为 -1

list contains (list, element)

如果列表包含元素,则返回 true

Expand
表 2.28. å�‚æ•°
�数类�

list

list

元素

任何类型,包括 null

示例

list contains( [1,2,3], 2 ) = true
Copy to Clipboard Toggle word wrap

count( list )

计算列表中的元素。

Expand
表 2.29. å�‚æ•°
�数类�

list

list

例�

count( [1,2,3] ) = 3
count( [] ) = 0
count( [1,[2,3]] ) = 2
Copy to Clipboard Toggle word wrap

min( list )

返回列表中最小比较元素。

Expand
表 2.30. å�‚æ•°
�数类�

list

list

替代签名

min( e1, e2, ..., eN )
Copy to Clipboard Toggle word wrap

例�

min( [1,2,3] ) = 1
min( 1 ) = 1
min( [1] ) = 1
Copy to Clipboard Toggle word wrap

max( list )

返回列表中最大比较元素。

Expand
表 2.31. å�‚æ•°
�数类�

list

list

替代签名

max( e1, e2, ..., eN )
Copy to Clipboard Toggle word wrap

例�

max( 1,2,3 ) = 3
max( [] ) = null
Copy to Clipboard Toggle word wrap

sum( list )

返回列表中数字的总和。

Expand
表 2.32. å�‚æ•°
�数类�

list

数量 元素 列表

替代签名

sum( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例�

sum( [1,2,3] ) = 6
sum( 1,2,3 ) = 6
sum( 1 ) = 1
sum( [] ) = null
Copy to Clipboard Toggle word wrap

mean( list )

计算列表中元素的平均(不同含义)。

Expand
表 2.33. å�‚æ•°
�数类�

list

数量 元素 列表

替代签名

mean( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例�

mean( [1,2,3] ) = 2
mean( 1,2,3 ) = 2
mean( 1 ) = 1
mean( [] ) = null
Copy to Clipboard Toggle word wrap

all( list )

如果列表中的所有元素都为 true,则返回 true。

Expand
表 2.34. å�‚æ•°
�数类�

list

布尔值 元素 列表

替代签名

all( b1, b2, ..., bN )
Copy to Clipboard Toggle word wrap

例�

all( [false,null,true] ) = false
all( true ) = true
all( [true] ) = true
all( [] ) = true
all( 0 ) = null
Copy to Clipboard Toggle word wrap

any( list )

如果列表中的任何元素为 true,则返回 true。

Expand
表 2.35. å�‚æ•°
�数类�

list

布尔值 元素 列表

替代签名

any( b1, b2, ..., bN )
Copy to Clipboard Toggle word wrap

例�

any( [false,null,true] ) = true
any( false ) = false
any( [] ) = false
any( 0 ) = null
Copy to Clipboard Toggle word wrap

sublist (list, start position, length?)

从起始位置返回子列表,仅限于 length 元素。

Expand
表 2.36. å�‚æ•°
�数类�

list

list

启动位置

number

长度 (可选)

number

示例

sublist( [4,5,6], 1, 2 ) = [4,5]
Copy to Clipboard Toggle word wrap

append( list, item )

创建附加到项目或项目的列表。

Expand
表 2.37. å�‚æ•°
�数类�

list

list

任何类型的

示例

append( [1], 2, 3 ) = [1,2,3]
Copy to Clipboard Toggle word wrap

concatenate( list )

创建是串联列表结果的列表。

Expand
表 2.38. å�‚æ•°
�数类�

list

list

示例

concatenate( [1,2],[3] ) = [1,2,3]
Copy to Clipboard Toggle word wrap

insert before( list, position, newItem )

创建在指定位置插入了 newItem 的列表。

Expand
表 2.39. å�‚æ•°
�数类�

list

list

position

number

newItem

任何类型的

示例

insert before( [1,3],1,2 ) = [2,1,3]
Copy to Clipboard Toggle word wrap

remove( list, position )

创建一个包含指定位置中排除的元素的列表。

Expand
表 2.40. å�‚æ•°
�数类�

list

list

position

number

示例

remove( [1,2,3], 2 ) = [1,3]
Copy to Clipboard Toggle word wrap

reverse( list )

返回反向列表。

Expand
表 2.41. å�‚æ•°
�数类�

list

list

示例

reverse( [1,2,3] ) = [3,2,1]
Copy to Clipboard Toggle word wrap

index of( list, match )

返回与元素匹配的索引。

�数

  • 类型列表 列表
  • 任何类型的 匹配
Expand
表 2.42. å�‚æ•°
�数类�

list

list

match

任何类型的

示例

index of( [1,2,3,2],2 ) = [2,4]
Copy to Clipboard Toggle word wrap

union( list )

从多个列表中返回所有元素的列表,并排除重复项。

Expand
表 2.43. å�‚æ•°
�数类�

list

list

示例

union( [1,2],[2,3] ) = [1,2,3]
Copy to Clipboard Toggle word wrap

distinct values( list )

从单个列表中返回元素列表,并排除重复项。

Expand
表 2.44. å�‚æ•°
�数类�

list

list

示例

distinct values( [1,2,3,2,1] ) = [1,2,3]
Copy to Clipboard Toggle word wrap

flatten( list )

返回扁平化列表。

Expand
表 2.45. å�‚æ•°
�数类�

list

list

示例

flatten( [[1,2],[[3]], 4] ) = [1,2,3,4]
Copy to Clipboard Toggle word wrap

product( list )

返回列表中数字的产品。

Expand
表 2.46. å�‚æ•°
�数类�

list

数量 元素 列表

替代签名

product( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例�

product( [2, 3, 4] ) = 24
product( 2, 3, 4 ) = 24
Copy to Clipboard Toggle word wrap

median (list)

返回列表中数字的介质。如果元素数量是奇数,则结果是中间的元素。如果元素数量甚至如此,则结果是两个中间元素的平均值。

Expand
表 2.47. å�‚æ•°
�数类�

list

数量 元素 列表

替代签名

median( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例�

median( 8, 2, 5, 3, 4 ) = 4
median( [6, 1, 2, 3] ) = 2.5
median( [ ] ) = null
Copy to Clipboard Toggle word wrap

stddev( list )

返回列表中数字的标准差异。

Expand
表 2.48. å�‚æ•°
�数类�

list

数量 元素 列表

替代签名

stddev( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例�

stddev( 2, 4, 7, 5 ) = 2.081665999466132735282297706979931
stddev( [47] ) = null
stddev( 47 ) = null
stddev( [ ] ) = null
Copy to Clipboard Toggle word wrap

mode( list )

返回列表中数字的模式。如果返回多个元素,则数字会按照升序排序。

Expand
表 2.49. å�‚æ•°
�数类�

list

数量 元素 列表

替代签名

mode( n1, n2, ..., nN )
Copy to Clipboard Toggle word wrap

例�

mode( 6, 3, 9, 6, 6 ) = [6]
mode( [6, 1, 9, 6, 1] ) = [1, 6]
mode( [ ] ) = [ ]
Copy to Clipboard Toggle word wrap

2.3.2.5. 数字功能

以下功能支持数字操作。

decimal (n, scale)

返回带有指定扩展的数字。

Expand
表 2.50. å�‚æ•°
�数类�

n

number

scale

范围内的 数字 [rhacm6111..6176]

例子

decimal( 1/3, 2 ) = .33
decimal( 1.5, 0 ) = 2
decimal( 2.5, 0 ) = 2
Copy to Clipboard Toggle word wrap

floor( n )

返回小于或等于指定数量的最大整数。

Expand
表 2.51. å�‚æ•°
�数类�

n

number

例�

floor( 1.5 ) = 1
floor( -1.5 ) = -2
Copy to Clipboard Toggle word wrap

ceiling( n )

返回大于或等于指定数量的最小整数。

Expand
表 2.52. å�‚æ•°
�数类�

n

number

例�

ceiling( 1.5 ) = 2
ceiling( -1.5 ) = -1
Copy to Clipboard Toggle word wrap

abs( n )

返回绝对值。

Expand
表 2.53. å�‚æ•°
�数类�

n

数字天和持续时间年数和月持续时间

例�

abs( 10 ) = 10
abs( -10 ) = 10
abs( @"PT5H" ) = @"PT5H"
abs( @"-PT5H" ) = @"PT5H"
Copy to Clipboard Toggle word wrap

modulo( dividend, divisor )

返回被分开的划分的剩余部分。如果 dind 或 divisor 是负数,则结果与 divisor 相同。

注意

此功能也表示为 modulo (dividend, divisor)= splitnd - divisor (dividen d/divisor)

Expand
表 2.54. å�‚æ•°
�数类�

splitnd

number

divisor

number

例�

modulo( 12, 5 ) = 2
modulo( -12,5 )= 3
modulo( 12,-5 )= -3
modulo( -12,-5 )= -2
modulo( 10.1, 4.5 )= 1.1
modulo( -10.1, 4.5 )= 3.4
modulo( 10.1, -4.5 )= -3.4
modulo( -10.1, -4.5 )= -1.1
Copy to Clipboard Toggle word wrap

sqrt( number )

返回指定数字的方括号。

Expand
表 2.55. å�‚æ•°
�数类�

n

number

示例

sqrt( 16 ) = 4
Copy to Clipboard Toggle word wrap

log( number )

返回指定数字的日志。

Expand
表 2.56. å�‚æ•°
�数类�

n

number

示例

decimal( log( 10 ), 2 ) = 2.30
Copy to Clipboard Toggle word wrap

exp( number )

返回 Euler 的数值,相当于指定数字的指数。

Expand
表 2.57. 参数
�数类�

n

number

示例

decimal( exp( 5 ), 2 ) = 148.41
Copy to Clipboard Toggle word wrap

odd( number )

如果指定数量为奇数,则返回 true

Expand
表 2.58. å�‚æ•°
�数类�

n

number

例�

odd( 5 ) = true
odd( 2 ) = false
Copy to Clipboard Toggle word wrap

even( number )

如果指定的数字是,则返回 true

Expand
表 2.59. å�‚æ•°
�数类�

n

number

例�

even( 5 ) = false
even ( 2 ) = true
Copy to Clipboard Toggle word wrap

2.3.2.6. 日期和时间功能

以下功能支持日期和时间操作。

is( value1, value2 )

如果两个值在 FEEL 语义域中都相同,则返回 true

Expand
表 2.60. å�‚æ•°
�数类�

value1

任何类型的

value2

任何类型的

例�

is( date( "2012-12-25" ), time( "23:00:50" ) ) = false
is( date( "2012-12-25" ), date( "2012-12-25" ) ) = true
is( time( "23:00:50z" ), time( "23:00:50" ) ) = false
Copy to Clipboard Toggle word wrap

2.3.2.7. 范围功能

以下功能支持临时排序操作,以在单个 scalar 值和这些值的范围之间建立关系。这些功能与健康状态级别 Seven (HL7)国际 质量语言(CQL) 1.4 语法中 的组件类似。

before( )

当元素 A 位于元素 B 之前时,返回 true,当同时满足评估到 true 的相关要求时。

签�

  1. before( point1 point2 )
  2. before (point range)
  3. before (range point)
  4. before( range1,range2 )

评估为 true的要求

  1. point1 < point2
  2. point < range.start or (point = range.start not (range.start included))
  3. range.end < point 或(range.end = point 而不是(range.end included))
  4. range1.end < range2.start 或((not (range1.end included) or not (range2.start included)和 range1.end = range2.start)

例�

before( 1, 10 ) = true
before( 10, 1 ) = false
before( 1, [1..10] ) = false
before( 1, (1..10] ) = true
before( 1, [5..10] ) = true
before( [1..10], 10 ) = false
before( [1..10), 10 ) = true
before( [1..10], 15 ) = true
before( [1..10], [15..20] ) = true
before( [1..10], [10..20] ) = false
before( [1..10), [10..20] ) = true
before( [1..10], (10..20] ) = true
Copy to Clipboard Toggle word wrap

after( )

当元素 A 位于元素 B 之后,返回 true,当同时满足评估到 true 的相关要求时。

签�

  1. after( point1 point2 )
  2. after (point range)
  3. after( range, point )
  4. after( range1 range2 )

评估为 true的要求

  1. point1 > point2
  2. point > range.end 或(point = range.end not (range.end included))
  3. range.start > point 或(range.start = point not (range.start included))
  4. range1.start > range2.end 或((not (range1.start included) or not (range2.end included)和 range1.start = range2.end)

例�

after( 10, 5 ) = true
after( 5, 10 ) = false
after( 12, [1..10] ) = true
after( 10, [1..10) ) = true
after( 10, [1..10] ) = false
after( [11..20], 12 ) = false
after( [11..20], 10 ) = true
after( (11..20], 11 ) = true
after( [11..20], 11 ) = false
after( [11..20], [1..10] ) = true
after( [1..10], [11..20] ) = false
after( [11..20], [1..11) ) = true
after( (11..20], [1..11] ) = true
Copy to Clipboard Toggle word wrap

meets( )

当元素 A 满足元素 B 以及满足评估到 true 的相关要求时,返回 true

签�

  1. meets( range1, range2 )

评估为 true的要求

  1. range1.end included and range2.start included and range1.end = range2.start

例�

meets( [1..5], [5..10] ) = true
meets( [1..5), [5..10] ) = false
meets( [1..5], (5..10] ) = false
meets( [1..5], [6..10] ) = false
Copy to Clipboard Toggle word wrap

met by( )

当元素 B 满足元素 A 以及同时满足评估到 true 的相关要求时,返回 true

签�

  1. met by( range1, range2 )

评估为 true的要求

  1. range1.start included 和 range2.end included and range1.start = range2.end

例�

met by( [5..10], [1..5] ) = true
met by( [5..10], [1..5) ) = false
met by( (5..10], [1..5] ) = false
met by( [6..10], [1..5] ) = false
Copy to Clipboard Toggle word wrap

overlaps( )

当元素 A 重叠元素 B 以及满足评估到 true 的相关要求时,返回 true

签�

  1. overlaps( range1, range2 )

评估为 true的要求

  1. (range1.end > range2.start or (range1.end = range2.start and (range1.end included or range2.end included))和(range1.start < range2.end or (range1.start = range2.end and range1.start included and range2.end included))

例�

overlaps( [1..5], [3..8] ) = true
overlaps( [3..8], [1..5] ) = true
overlaps( [1..8], [3..5] ) = true
overlaps( [3..5], [1..8] ) = true
overlaps( [1..5], [6..8] ) = false
overlaps( [6..8], [1..5] ) = false
overlaps( [1..5], [5..8] ) = true
overlaps( [1..5], (5..8] ) = false
overlaps( [1..5), [5..8] ) = false
overlaps( [1..5), (5..8] ) = false
overlaps( [5..8], [1..5] ) = true
overlaps( (5..8], [1..5] ) = false
overlaps( [5..8], [1..5) ) = false
overlaps( (5..8], [1..5) ) = false
Copy to Clipboard Toggle word wrap

overlaps before( )

当元素 A 重叠前和满足评估到 true 的相关要求时,返回 true

签�

  1. overlaps before( range1 range2 )

评估为 true的要求

  1. (range1.start < range2.start or (range1.start = range2.start and range1.start included and range2.start included)和(range1.end > range2.start or (range1.end = range2.start and range2.start included))和(range1.end < range2.end = range2.end = range2.end,(not (range1.end included)或 range2.end included))

例�

overlaps before( [1..5], [3..8] ) = true
overlaps before( [1..5], [6..8] ) = false
overlaps before( [1..5], [5..8] ) = true
overlaps before( [1..5], (5..8] ) = false
overlaps before( [1..5), [5..8] ) = false
overlaps before( [1..5), (1..5] ) = true
overlaps before( [1..5], (1..5] ) = true
overlaps before( [1..5), [1..5] ) = false
overlaps before( [1..5], [1..5] ) = false
Copy to Clipboard Toggle word wrap

overlaps after( )

当元素 A 在元素 B 之后以及也满足评估到 true 的相关要求时,返回 true

签�

  1. overlaps after( range1 range2 )

评估为 true的要求

  1. (range2.start < range1.start or (range2.start = range1.start and range2.start included and not (range1.start included)) and (range2.end > range1.start or (range2.start and range2.end included))和 range1.start)和(range2.end < range1.end or (range2.end = range1.end and (not (range2.end included)或 range1.end included))

例�

overlaps after( [3..8], [1..5] )= true
overlaps after( [6..8], [1..5] )= false
overlaps after( [5..8], [1..5] )= true
overlaps after( (5..8], [1..5] )= false
overlaps after( [5..8], [1..5) )= false
overlaps after( (1..5], [1..5) )= true
overlaps after( (1..5], [1..5] )= true
overlaps after( [1..5], [1..5) )= false
overlaps after( [1..5], [1..5] )= false
overlaps after( (1..5), [1..5] )= false
overlaps after( (1..5], [1..6] )= false
overlaps after( (1..5], (1..5] )= false
overlaps after( (1..5], [2..5] )= false
Copy to Clipboard Toggle word wrap

finishes( )

当元素 A 完成元素 B 以及满足评估到 true 的相关要求时,返回 true

签�

  1. finishes (point, range)
  2. finishes( range1, range2 )

评估为 true的要求

  1. range.end included and range.end = point
  2. range1.end included = range2.end included 和 range1.end = range2.end 和(range1.start > range2.start or (range1.start = range2.start and (not (range1.start included)或 range2.start included))

例�

finishes( 10, [1..10] ) = true
finishes( 10, [1..10) ) = false
finishes( [5..10], [1..10] ) = true
finishes( [5..10), [1..10] ) = false
finishes( [5..10), [1..10) ) = true
finishes( [1..10], [1..10] ) = true
finishes( (1..10], [1..10] ) = true
Copy to Clipboard Toggle word wrap

finished by( )

当元素 A 通过元素 B 完成时,返回 true,当同时满足评估到 true 的相关要求时。

签�

  1. finished by (range, point)
  2. finished by( range1 range2 )

评估为 true的要求

  1. range.end included and range.end = point
  2. range1.end included = range2.end included 和 range1.end = range2.end and (range1.start < range2.start or (range1.start = range2.start and (range1.start included or not (range2.start included)))

例�

finished by( [1..10], 10 ) = true
finished by( [1..10), 10 ) = false
finished by( [1..10], [5..10] ) = true
finished by( [1..10], [5..10) ) = false
finished by( [1..10), [5..10) ) = true
finished by( [1..10], [1..10] ) = true
finished by( [1..10], (1..10] ) = true
Copy to Clipboard Toggle word wrap

includes( )

当元素 A 包含元素 B 以及满足评估到 true 的相关要求时,返回 true

签�

  1. includes (range, point)
  2. includes (range1, range2)

评估为 true的要求

  1. (range.start < point 和 range.end > point)或(range.start = point and range.start included)或(range.end = point.end included)
  2. (range1.start < range2.start or (range1.start = range2.start and (range1.start includes or not (range2.start included)))和(range1.end > range2.end or (range1.end = range2.end and (range1.end included or not (range2.end included))))

例�

includes( [1..10], 5 ) = true
includes( [1..10], 12 ) = false
includes( [1..10], 1 ) = true
includes( [1..10], 10 ) = true
includes( (1..10], 1 ) = false
includes( [1..10), 10 ) = false
includes( [1..10], [4..6] ) = true
includes( [1..10], [1..5] ) = true
includes( (1..10], (1..5] ) = true
includes( [1..10], (1..10) ) = true
includes( [1..10), [5..10) ) = true
includes( [1..10], [1..10) ) = true
includes( [1..10], (1..10] ) = true
includes( [1..10], [1..10] ) = true
Copy to Clipboard Toggle word wrap

during( )

当元素 A 在元素 B 期间,返回 true,当同时满足评估到 true 的相关要求时。

签�

  1. during( point, range )
  2. during( range1 range2 )

评估为 true的要求

  1. (range.start < point 和 range.end > point)或(range.start = point and range.start included)或(range.end = point.end included)
  2. (range2.start < range1.start or (range2.start = range1.start and (range2.start included or not (range1.start included)))和(range2.end > range1.end or (range2.end = range1.end and (range2.end included or not (range1.end included))))

例�

during( 5, [1..10] ) = true
during( 12, [1..10] ) = false
during( 1, [1..10] ) = true
during( 10, [1..10] ) = true
during( 1, (1..10] ) = false
during( 10, [1..10) ) = false
during( [4..6], [1..10] ) = true
during( [1..5], [1..10] ) = true
during( (1..5], (1..10] ) = true
during( (1..10), [1..10] ) = true
during( [5..10), [1..10) ) = true
during( [1..10), [1..10] ) = true
during( (1..10], [1..10] ) = true
during( [1..10], [1..10] ) = true
Copy to Clipboard Toggle word wrap

starts( )

当元素 A 启动元素 B 以及满足评估到 true 的相关要求时,返回 true

签�

  1. starts( point, range )
  2. starts( range1, range2 )

评估为 true的要求

  1. range.start = point and range.start included
  2. range1.start = range2.start and range1.start included = range2.start included and (range1.end < range2.end or (range1.end = range2.end and (not (range1.end included)或 range2.end included))

例�

starts( 1, [1..10] ) = true
starts( 1, (1..10] ) = false
starts( 2, [1..10] ) = false
starts( [1..5], [1..10] ) = true
starts( (1..5], (1..10] ) = true
starts( (1..5], [1..10] ) = false
starts( [1..5], (1..10] ) = false
starts( [1..10], [1..10] ) = true
starts( [1..10), [1..10] ) = true
starts( (1..10), (1..10) ) = true
Copy to Clipboard Toggle word wrap

started by( )

当元素 A 由元素 B 以及满足评估到 true 的相关要求时,返回 true

签�

  1. started by( range, point )
  2. started by( range1, range2 )

评估为 true的要求

  1. range.start = point and range.start included
  2. range1.start = range2.start and range1.start included = range2.start included and (range2.end < range1.end or (range2.end = range1.end and (not (range2.end included)或 range1.end included))

例�

started by( [1..10], 1 ) = true
started by( (1..10], 1 ) = false
started by( [1..10], 2 ) = false
started by( [1..10], [1..5] ) = true
started by( (1..10], (1..5] ) = true
started by( [1..10], (1..5] ) = false
started by( (1..10], [1..5] ) = false
started by( [1..10], [1..10] ) = true
started by( [1..10], [1..10) ) = true
started by( (1..10), (1..10) ) = true
Copy to Clipboard Toggle word wrap

coincides( )

当元素与元素 B 和满足评估到 true 的相关要求时,返回 true

签�

  1. coincides (point1, point2)
  2. coincides (range1, range2)

评估为 true的要求

  1. point1 = point2
  2. range1.start = range2.start and range1.start included = range2.start included 和 range1.end = range2.end included = range2.end included = range2.end included

例�

coincides( 5, 5 ) = true
coincides( 3, 4 ) = false
coincides( [1..5], [1..5] ) = true
coincides( (1..5), [1..5] ) = false
coincides( [1..5], [2..6] ) = false
Copy to Clipboard Toggle word wrap

2.3.2.8. 临时功能

以下功能支持常规临时操作。

第一天(日期 )

返回年当日的 Iceorian 号。

Expand
表 2.61. å�‚æ•°
�数类�

date

日期和时间

示例

day of year( date(2019, 9, 17) ) = 260
Copy to Clipboard Toggle word wrap

week (date)的日期

返回星期几天:" Monday"、" Tuesday""Wednesday""Thursday""Friday""Saturday""Sunday "。

Expand
表 2.62. å�‚æ•°
�数类�

date

日期和时间

示例

day of week( date(2019, 9, 17) ) = "Tuesday"
Copy to Clipboard Toggle word wrap

year of month (date)

返回年月的 Iceorian: "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , 或 "December "。

Expand
表 2.63. å�‚æ•°
�数类�

date

日期和时间

示例

month of year( date(2019, 9, 17) ) = "September"
Copy to Clipboard Toggle word wrap

year of month (date)

返回由 ISO 8601 定义年一周。

Expand
表 2.64. å�‚æ•°
�数类�

date

日期和时间

例�

week of year( date(2019, 9, 17) ) = 38
week of year( date(2003, 12, 29) ) = 1
week of year( date(2004, 1, 4) ) = 1
week of year( date(2005, 1, 1) ) = 53
week of year( date(2005, 1, 3) ) = 1
week of year( date(2005, 1, 9) ) = 1
Copy to Clipboard Toggle word wrap

2.3.2.9. 排序功能

以下功能支持排序操作。

sort( list, precedes )

返回同一元素的列表,但根据排序功能排序。

Expand
表 2.65. å�‚æ•°
�数类�

list

list

前者

function

示例

sort( list: [3,1,4,5,2], precedes: function(x,y) x < y ) = [1,2,3,4,5]
Copy to Clipboard Toggle word wrap

2.3.2.10. 上下文功能

以下功能支持上下文操作。

get value( m, key )

从指定条目键的上下文返回值。

Expand
表 2.66. å�‚æ•°
�数类�

m

context

key

字符串

例�

get value( {key1 : "value1"}, "key1" ) = "value1"
get value( {key1 : "value1"}, "unexistent-key" ) = null
Copy to Clipboard Toggle word wrap

get entries( m )

返回指定上下文的键值对列表。

Expand
表 2.67. å�‚æ•°
�数类�

m

context

示例

get entries( {key1 : "value1", key2 : "value2"} ) = [ { key : "key1", value : "value1" }, {key : "key2", value : "value2"} ]
Copy to Clipboard Toggle word wrap

2.3.3. FEEL 中的变量和函数名称

与很多传统表达式语言不同,FEEL (FEEL)支持空格和一些特殊字符作为变量和功能名称的一部分。FEEL 名称 必须以字母、? _ 元素开头。也允许使用 unicode 字母字符。变量名称不能以语言关键字开头,如 true每个 名称。变量名称中的剩余字符可以是任何起始字符,以及 数字、空格和特殊字符,如 +- -、/、+、'.

例如,以下名称是所有有效的 FEEL 名称:

  • 年龄
  • birth Date
  • flight 234 预检查过程

FEEL 中的变量和功能名称有几个限制:

模糊
使用空格、关键字和其他特殊字符作为名称的一部分可能会导致 FEEL 模糊。模糊在表达式的上下文中解决,从左到右匹配。解析器将变量名称解析为在范围内匹配的最大名称。如果需要,您可以使用 () 来忽略名称。
名称中的空格

DMN 规格限制 FEEL 名称中的空格的使用。根据 DMN 规格,名称可以包含多个空格,但不能包含两个连续空格。

为了使语言更易于使用并避免由于空格造成的常见错误,Red Hat Process Automation Manager 会删除对连续空格的使用的限制。Red Hat Process Automation Manager 支持带有任意数量的连续空格的变量名称,但将它们规范化为一个空间。例如,Red Hat Process Automation Manager 中可以接受 变量引用 带有一个空格和第一个名称,其中两个空格都可以接受。

Red Hat Process Automation Manager 还规范化使用其他空格,如网页、标签页和行破坏中常见的不可破坏的空格。从 Red Hat Process Automation Manager FEEL 引擎的角度来看,所有这些字符在处理前都规范化成一个空格。

关键字 中的关键字
中的 关键字是语言中不能用作变量名称一部分的唯一关键字。虽然规范允许在变量名称的中间使用关键字,但在变量名称中使用关键字与 grammar 定义冲突,每个 表达式结构和 一些 表达式结构。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat