XPath 函数和运算符

IBM® Business MonitorIBM Business Monitor Development Toolkit 中实现 XML Path Language (XPath) 2.0 的子集。

以下各表显示 Business MonitorBusiness Monitor development Toolkit 支持的 XPath 2.0 符号、运算符、终止符号和函数。有关 XPath 2.0 的更多信息,包括巴科斯范式(EBNF)的完整语法,请参阅 http://www.w3.org/TR/xpath20/

支持的符号

下表确定了支持的符号。第一列中的符号编号可在 http://www.w3.org/TR/xpath20/#id-grammar 中找到。
表 1. 支持的符号
数字 符号 包含 表达式
[1] XPath ::= Expr
[2] Expr ::= ExprSingle
[3] ExprSingle ::= IfExpr | OrExpr
[7] IfExpr ::= "if" "(" Expr ")" "then" ExprSingle "else" ExprSingle
[8] OrExpr ::= AndExpr ( "or" AndExpr )*
[9] AndExpr ::= ComparisonExpr ( "and" ComparisonExpr )*
[10] ComparisonExpr ::= RangeExpr ( (ValueComp | GeneralComp) RangeExpr )?
[11] RangeExpr ::= AdditiveExpr
[12] AdditiveExpr ::= MultiplicativeExpr ( ("+" | "-") MultiplicativeExpr )*
[13] MultiplicativeExpr ::= UnionExpr ( ("*" | "div" | "idiv" | "mod") UnionExpr )*
[14] UnionExpr ::= IntersectExceptExpr
[15] IntersectExceptExpr ::= InstanceofExpr
[16] InstanceofExpr ::= TreatExpr
[17] TreatExpr ::= CastableExpr
[18] CastableExpr ::= CastExpr
[19] CastExpr ::= UnaryExpr
[20] UnaryExpr ::= ("-" | "+")* ValueExpr
[21] ValueExpr ::= PathExpr
[22] GeneralComp ::= "=" | "!=" | "<" | "<=" | ">" | ">="
[23] ValueComp ::= "eq" | "ne" | "lt" | "le" | "gt" | "ge"
[25] PathExpr ::= ("/" RelativePathExpr?) | RelativePathExpr
[26] RelativePathExpr ::= StepExpr (("/") StepExpr)*
[27] StepExpr ::= FilterExpr | AxisStep
[28] AxisStep ::= (ReverseStep | ForwardStep)
[29] ForwardStep ::= AbbrevForwardStep
[31] AbbrevForwardStep ::= NodeTest
[32] ReverseStep ::= AbbrevReverseStep
[34] AbbrevReverseStep ::= ".."
[35] NodeTest ::= NameTest
[36] NameTest ::= QName
[38] FilterExpr ::= PrimaryExpr
[41] PrimaryExpr ::= Literal | ParenthesizedExpr | ContextItemExpr | FunctionCall
[42] Literal ::= NumericLiteral | StringLiteral
[43] NumericLiteral ::= IntegerLiteral | DecimalLiteral
[46] ParenthesizedExpr ::= "(" Expr? ")"
[47] ContextItemExpr ::= "."
[48] FunctionCall ::= QName "(" (ExprSingle ("," ExprSingle)*)? ")"

对入站和出站事件的附加支持

要专门引用入站和出站事件,请使用以下路径。

公共基本事件预定义数据元素:
InboundEventDefinitionRef '/' 'predefinedData' '/' (
'creationTime'|'elapsedTime'|'extensionName'|'globalInstanceId'|
'localInstanceId'|'msg'|'priority'|'repeatCount'|'sequenceNumber'|
'severity'|'version')
公共基本事件上下文数据元素:
InboundEventDefinitionRef '/' 'propertyData' '/' ContextDataElementName
公共基本事件扩展数据元素:
InboundEventDefinitionRef '/' 'extendedData' '/' ExtendedDataElementName (
'/' ExtendedDataElementName)*
任意事件内容:
InboundEventDefinitionRef '/' EventPartId '/' Expr
其中:
  • InboundEventDefinitionRef 是监控上下文定义层次结构中事件入口点或出口点的路径。 该路径可以包含嵌套监控上下文定义的标识,即一点(“.”)或两点(“..”)。它必须用最后一步作为一个入站事件定义标识,并且是唯一标识。例如,itemContext/outOfStockEvent
  • ContextDataElementName 是公共基本事件类型的引用事件入口点或出口点所定义的上下文数据元素的名称。 通过使用 extensionName 属性引用恰当的“公共基本事件”事件类型定义。
  • ExtendedDataElementName 是公共基本事件类型的引用事件入口点或出口点所定义的扩展数据元素的名称。 通过使用 extensionName 属性引用恰当的事件类型定义。
  • EventPartId 是为引用的事件入口点或出口点定义的事件部分的标识。
  • Expr 是入站或出站事件数据结构的路径,它附加在为 EventPartId 引用的事件部分定义的路径之后。有关入站事件的路径,请参阅表 2。 有关出站事件的路径(即,出站事件字段赋值的左侧),请参阅表 3。此外,用于构造出站事件顺序的数字谓词不得有间隙,并且必须在每个嵌套级别按升序排列。 没有数字谓词的步骤等同于后跟 [1]。
下表适用于引用入站事件及其内容的表达式。
表 2. 引用事件内容的入站事件路径
符号 表达式
Expr UnionExpr | FunctionName '(' UnionExpr ')'
FunctionName 'fn:count' | 'fn:avg' | 'fn:max' | 'fn:min' | 'fn:sum'
UnionExpr PathExpr ('|' PathExpr)*
PathExpr (StepExpr '/')* (StepExpr | ('@' | 'attribute::') AttrNameTest | ('child::')? 'text()')
StepExpr ('.' | ('child::')? NameTest) ('[' PredicateExpr ']')*
NameTest QName | '*' | NCName ':' '*'
AttrNameTest NameTest | '*' ':' NCName
PredicateExpr OrExpr | Digits
OrExpr AndExpr ('or' AndExpr)*
AndExpr BooleanExpr ('and' BooleanExpr)*
BooleanExpr '(' OrExpr ')' | ValueExpr GeneralComp ValueExpr | ('@' | 'attribute::') AttrNameTest
GeneralComp '=' | '!=' | '<' | '<=' | '>' | '>='
ValueExpr ('@' | 'attribute::') AttrNameTest | Literal
Literal NumericLiteral | StringLiteral
StringLiteral ('"' (EscapeQuot | [^"])* '"') | ("'" (EscapeApos | [^'])* "'")
NumericLiteral IntegerLiteral | DecimalLiteral | DoubleLiteral
IntegerLiteral [+-]? Digits
DecimalLiteral [+-]? ('.' Digits) | (Digits '.' [0-9]*)
DoubleLiteral [+-]? (('.' Digits) | (Digits ('.' [0-9]*)?)) [eE] [+-]? Digits
EscapeQuot '""'
EscapeApos "''"
Digits [0-9]+
下表适用于引用出站事件及其内容的表达式。
表 3. 引用事件内容的出站事件路径
符号 表达式
Expr PathExpr
PathExpr (StepExpr '/')* ( StepExpr | '@' AttrNameTest )
StepExpr NameTest ('[' Digits ']')?
NameTest QName
AttrNameTest NameTest
Digits [0-9]+

受支持的运算符

下表列出了受支持的运算符。行号指示优先顺序,在 http://www.w3.org/TR/xpath20/#id-precedence-order 中对其进行了定义。
表 4. 受支持的运算符
数字 操作员
3 if
4 或者
5
6 eq、ne、lt、le、gt、ge、=、!=、<、<=、>、>=
8 +, -
9 *、div、idiv、mod
16 -(unary), +(unary)
18 /
19 ( )

关于非空操作数,值比较运算符(ne、lt、le、gt 和 ge)与常规比较运算符(=、!=、<、<=、> 和 >=)的行为相同。但是,如果其中一个或两个操作数都为空(空序列),那么值比较将返回空值,而常规比较将返回值 false

支持的终止符号

下表列出了受支持的终止符号。第一列中的符号编号可在 http://www.w3.org/TR/xpath20/#lexical-structure 中找到。
表 5. 支持的终止符号
数字 符号 包含 表达式
[71] IntegerLiteral ::= Digits
[72] DecimalLiteral ::= ("." Digits) | (Digits "." [0-9]*)
[74] StringLiteral ::= ("'" (EscapeApos | [^'])* "'")
[76] EscapeApos ::= " '' "

访问列表内的元素

可以使用谓词来引用列表内的元素(有时候也称为数组元素)。 谓词是用方括号括起的表达式,跟在引用列表的路径表达式之后。例如,如果 myEvent/myEventPart/theOrder/item 指向订单中的项的列表,那么您可以使用方括号将数字索引括起以引用单个项。 例如,要访问某个项(例如项 12)的价格,可使用:
myEvent/myEventPart/theOrder/item[12]/price
列表还可用作聚集函数的参数。 例如,要计算所有订单中价格的总和,可使用:
fn:sum(myEvent/myEventPart/theOrder/item/price)
有关更多信息,请参阅聚集函数

支持的构造函数

以下是受支持的构造函数。构造函数是 Business Monitor 用于支持强制类型转换的 XPath 2.0 机制。在 XPath 2.0 中,构造函数的语义等同于使用“cast as”运算符,但语法不同。
  • xs:boolean($arg as xs:boolean?) as xs:boolean?
  • xs:boolean($arg as xs:integer?) as xs:boolean?
  • xs:boolean($arg as xs:decimal?) as xs:boolean?
  • xs:boolean($arg as xs:string?) as xs:boolean?
  • xs:integer($arg as xs:boolean?) as xs:integer?
  • xs:integer($arg as xs:integer?) as xs:integer?
  • xs:integer($arg as xs:decimal?) as xs:integer?
  • xs:integer($arg as xs:string?) as xs:integer?
  • xs:decimal($arg as xs:boolean?) as xs:decimal?
  • xs:decimal($arg as xs:integer?) as xs:decimal?
  • xs:decimal($arg as xs:decimal?) as xs:decimal?
  • xs:decimal($arg as xs:string?) as xs:decimal?
  • xs:decimal($arg as xs:duration?) as xs:decimal?
  • xs:string($arg as xs:boolean?) as xs:string?
  • xs:string($arg as xs:integer?) as xs:string?
  • xs:string($arg as xs:decimal?) as xs:string?
  • xs:string($arg as xs:string?) as xs:string?
  • xs:string($arg as xs:duration?) as xs:string?
  • xs:string($arg as xs:dateTime?) as xs:string?
  • xs:string($arg as xs:date?) as xs:string?
  • xs:string($arg as xs:time?) as xs:string?
  • xs:duration($arg as xs:string?) as xs:duration?
  • xs:duration($arg as xs:duration?) as xs:duration?
  • xs:duration($arg as xs:decimal?) as xs:duration?
  • xs:dayTimeDuration($arg as xs:integer?) as xs:dayTimeDuration?
  • xs:dayTimeDuration($arg as xs:decimal?) as xs:dayTimeDuration?
  • xs:dayTimeDuration($arg as xs:string?) as xs:dayTimeDuration?
  • xs:dayTimeDuration($arg as xs:duration?) as xs:dayTimeDuration?
  • xs:dateTime($arg as xs:string?) as xs:dateTime?
  • xs:dateTime($arg as xs:dateTime?) as xs:dateTime?
  • xs:dateTime($arg as xs:date?) as xs:dateTime?
  • xs:date($arg as xs:string?) as xs:date?
  • xs:date($arg as xs:dateTime?) as xs:date?
  • xs:date($arg as xs:date?) as xs:date?
  • xs:time($arg as xs:string?) as xs:time?
  • xs:time($arg as xs:dateTime?) as xs:time?
  • xs:time($arg as xs:time?) as xs:time?

如果布尔构造函数的数字参数是非零值,那么该函数将返回值 true;如果为零,将返回 false。如果数字构造函数的布尔参数为 true,那么该函数将返回 1;如果为 false,将返回 0。带有十进制参数的整数构造函数将废弃该参数的任何小数部分。 在小数和持续时间值之间进行转换的构造函数,将把日期/时间持续时间映射为以秒为单位的时间(包括小数部分),反之亦然。对于带有字符串参数的所有构造函数,都应该使用有效的词汇来表示结果数据类型。 返回字符串值的构造函数返回参数的规范文字表示。带日期参数的 dateTime 构造函数返回指定日期的初始时间。

支持的通用函数

支持可用 XPath 2.0 函数的以下子集。使用的名称空间声明为 xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:fn="http://www.w3.org/2005/xpath-functions"(与 http://www.w3.org/TR/xpath-functions/ 中相同)。
  • fn:abs($arg as xs:integer?) as xs:integer?
  • fn:abs($arg as xs:decimal?) as xs:decimal?
  • fn:round($arg as xs:decimal?) as xs:decimal?
  • fn:round($arg as xs:integer?) as xs:integer?
  • fn:concat($arg1 as xs:anyAtomicType?, $arg2 as xs:anyAtomicType?, ... ) as xs:string
  • fn:compare($comparand1 as xs:string?, $comparand2 as xs:string?) as xs:integer?
  • fn:substring($sourceString as xs:string?, $startingLoc as xs:integer) as xs:string
  • fn:substring($sourceString as xs:string?, $startingLoc as xs:decimal) as xs:string
  • fn:substring($sourceString as xs:string?, $startingLoc as xs:integer, $length as xs:integer) as xs:string
  • fn:substring($sourceString as xs:string?, $startingLoc as xs:integer, $length as xs:decimal) as xs:string
  • fn:substring($sourceString as xs:string?, $startingLoc as xs:decimal, $length as xs:integer) as xs:string
  • fn:substring($sourceString as xs:string?, $startingLoc as xs:decimal, $length as xs:decimal) as xs:string
  • fn:string-length($arg as xs:string?) as xs:integer?
  • fn:upper-case($arg as xs:string?) as xs:string
  • fn:lower-case($arg as xs:string?) as xs:string
  • fn:contains($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean
  • fn:starts-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean
  • fn:ends-with($arg1 as xs:string?, $arg2 as xs:string?) as xs:boolean
  • fn:true() as xs:boolean
  • fn:false() as xs:boolean
  • fn:not($arg as xs:boolean?) as xs:boolean
  • fn:not($arg as xs:integer?) as xs:boolean
  • fn:not($arg as xs:decimal?) as xs:boolean
  • fn:not($arg as xs:string?) as xs:boolean
  • fn:empty($arg as xs:anyAtomicType?) as xs:boolean
  • fn:exists($arg as xs:anyAtomicType?) as xs:boolean
  • fn:current-dateTime() as xs:dateTime
  • fn:current-date() as xs:date
  • fn:current-time() as xs:time
  • fn:days-from-duration($arg as xs:duration?) as xs:integer?
  • fn:hours-from-duration($arg as xs:duration?) as xs:integer?
  • fn:minutes-from-duration($arg as xs:duration?) as xs:integer?
  • fn:seconds-from-duration($arg as xs:duration?) as xs:decimal?
  • fn:year-from-dateTime($arg as xs:dateTime?) as xs:integer?
  • fn:month-from-dateTime($arg as xs:dateTime?) as xs:integer?
  • fn:day-from-dateTime($arg as xs:dateTime?) as xs:integer?
  • fn:hours-from-dateTime($arg as xs:dateTime?) as xs:integer?
  • fn:minutes-from-dateTime($arg as xs:dateTime?) as xs:integer?
  • fn:seconds-from-dateTime($arg as xs:dateTime?) as xs:decimal?
  • fn:timezone-from-dateTime($arg as xs:dateTime?) as xs:dayTimeDuration?
  • fn:year-from-date($arg as xs:date?) as xs:integer?
  • fn:month-from-date($arg as xs:date?) as xs:integer?
  • fn:day-from-date($arg as xs:date?) as xs:integer?
  • fn:timezone-from-date($arg as xs:date?) as xs:dayTimeDuration?
  • fn:hours-from-time($arg as xs:time?) as xs:integer?
  • fn:minutes-from-time($arg as xs:time?) as xs:integer?
  • fn:seconds-from-time($arg as xs:time?) as xs:decimal?
  • fn:timezone-from-time($arg as xs:time?) as xs:dayTimeDuration?
  • fn:adjust-dateTime-to-timezone($arg as xs:dateTime?) as xs:dateTime?
  • fn:adjust-dateTime-to-timezone($arg as xs:dateTime?, $timezone as xs:dayTimeDuration?) as xs:dateTime?
  • fn:adjust-date-to-timezone($arg as xs:date?) as xs:date?
  • fn:adjust-date-to-timezone($arg as xs:date?, $timezone as xs:dayTimeDuration?) as xs:date?
  • fn:adjust-time-to-timezone($arg as xs:time?) as xs:time?
  • fn:adjust-time-to-timezone($arg as xs:time?, $timezone as xs:dayTimeDuration?) as xs:time?
  • fn:count($arg as item()*) as xs:integer
  • fn:avg($arg as xs:integer*) as xs:decimal?
  • fn:avg($arg as xs:decimal*) as xs:decimal?
  • fn:max($arg as xs:integer*) as xs:integer?
  • fn:max($arg as xs:decimal*) as xs:decimal?
  • fn:min($arg as xs:integer*) as xs:integer?
  • fn:min($arg as xs:decimal*) as xs:decimal?
  • fn:sum($arg as xs:integer*) as xs:integer?
  • fn:sum($arg as xs:decimal*) as xs:decimal?

聚集函数

支持五个聚集函数 fn:countfn:avgfn:maxfn:minfn:sum(在 http://www.w3.org/TR/xpath-functions/#aggregate-functions 中定义),前提是它们的参数引用入站事件中的数据。 fn:count() 的参数可以具有任何类型。其他四个函数必须具有数字参数。

例如,fn:sum(myEvent/extendedData/widgetList/widget/quantity) 返回扩展数据元素中存放的列表中的窗口小部件总数。

fn:avg(myEvent/listOfItems/tns:item/@tns:cost) 返回 listOfItems 事件部分表示的列表中的项平均成本。

检索 QName 值

事件中数据类型定义为 xs:QName 的属性或元素的值将检索为以下格式的字符串:{namespaceName}localPart。 基于事件中的名称空间声明,通过解析 QName 前缀来获取名称空间名称。例如,如果事件包含名称空间声明 xmlns:app="http://www.my.com/my/application/namespace",那么 QName 值 app:customerRating 将检索为 {http://www.my.com/my/application/namespace}customerRating

比较时区

数据类型为日期、时间或日期时间的度量的值可以是根据时区调整的值,也可以是未根据时区调整的值。 对数据类型为日期、时间或日期时间的度量进行比较时:
  • 两个值都必须与时区关联,或者
  • 两个值都不得与时区关联
否则,进行比较时,在运行时将发生错误。