Funciones XPath y operadores

Se implementa un conjunto de XPath (XML Path Language) 2.0 en IBM® Business Monitor e IBM Business Monitor Development Toolkit.

Las tablas siguientes muestran los símbolos, operadores, símbolos de terminales y funciones de XPath 2.0 que están soportados en Business Monitor y Business Monitor Development Toolkit. Para obtener más información sobre XPath 2.0, incluida la sintaxis completa en EBNF (Extended Backus-Naur Form), consulte http://www.w3.org/TR/xpath20/.

Símbolos soportados

En la tabla siguiente se identifican los símbolos admitidos. Los números de símbolo de la primera columna se encuentran en http://www.w3.org/TR/xpath20/#id-grammar.
Tabla 1. Símbolos soportados
Número Símbolo Consta de Expresión
[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)*)? ")"

Soporte adicional para sucesos de entrada y salida

Para hacer referencia a sucesos de entrada y salida específicamente, utilice las vías de acceso siguientes.

Elementos de datos predefinidos Common Base Event:
InboundEventDefinitionRef '/' 'predefinedData' '/' (
'creationTime'|'elapsedTime'|'extensionName'|'globalInstanceId'|
'localInstanceId'|'msg'|'priority'|'repeatCount'|'sequenceNumber'|
'severity'|'version')
Elementos de datos de contexto Common Base Event:
InboundEventDefinitionRef '/' 'propertyData' '/' ContextDataElementName
Elementos de datos ampliados Common Base Event:
InboundEventDefinitionRef '/' 'extendedData' '/' ExtendedDataElementName (
'/' ExtendedDataElementName)*
Cualquier contenido de suceso:
InboundEventDefinitionRef '/' EventPartId '/' Expr
donde:
  • InboundEventDefinitionRef es una vía de acceso a un punto de entrada de suceso o un punto de salida en una jerarquía de definición de contexto de supervisión. La vía de acceso puede incluir los ID de definiciones anidadas de contexto de supervisión, punto "." o dos puntos seguidos (".."). Debe tener como último paso un ID, y solamente uno, de una definición de suceso de entrada. Por ejemplo, itemContext/outOfStockEvent.
  • ContextDataElementName es el nombre de un elemento de datos de contexto definido por el tipo Common Base Event del punto de salida o entrada del suceso al que se hace referencia. Se hace referencia a la definición de tipo de suceso Common Base Event pertinente mediante el atributo extensionName.
  • ExtendedDataElementName es el nombre de un elemento de datos ampliado definido por el tipo Common Base Event de punto de salida o entrada del suceso al que se hace referencia. Se hace referencia a la definición de tipo de suceso pertinente mediante el atributo extensionName.
  • EventPartId es el ID de una parte de suceso definida para el punto de entrada o salida al que se hace referencia.
  • Expr es una vía de acceso a una estructura de datos de sucesos de entrada o salida, que se añade al final de la vía de acceso definida para la parte de suceso a la que se hace referencia mediante EventPartId. Para las vías de acceso a sucesos de entrada, se aplica la tabla 2. Para las vías de acceso de los sucesos de salida (es decir, los extremos de la izquierda de las asignaciones de campos de sucesos de salida) se aplica la tabla 3. Asimismo, los predicados numéricos que se utilizan para crear secuencias en sucesos de salida no deben contener espacios vacíos y deben ser ascendentes en cada nivel de anidación. Un paso que no tenga un predicado numérico es equivalente a uno seguido de [1].
La tabla siguiente se aplica a las expresiones que hacen referencia los sucesos de entrada y su contenido.
Tabla 2. Vías de acceso de sucesos de entrada que hacen referencia a contenido de suceso.
Símbolo Expresión
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]+
La tabla siguiente se aplica a las expresiones que hacen referencia a los sucesos de salida y su contenido.
Tabla 3. Vías de acceso de sucesos de salida que hacen referencia a contenido de suceso.
Símbolo Expresión
Expr PathExpr
PathExpr (StepExpr '/')* ( StepExpr | '@' AttrNameTest )
StepExpr NameTest ('[' Digits ']')?
NameTest QName
AttrNameTest NameTest
Digits [0-9]+

Operadores soportados

En la tabla siguiente se identifican los operadores soportados. Los números de fila indican el orden de precedencia y están definidos en http://www.w3.org/TR/xpath20/#id-precedence-order.
Tabla 4. Operadores soportados
Número Operador
3 if
4 or
5 y
6 eq, ne, lt, le, gt, ge, =, !=, <, <=, >, >=
8 +, -
9 *, div, idiv, mod
16 -(unary), +(unary)
18 /
19 ( )

Para los operandos que no son nulos, los operadores de comparación de valores (ne, lt, le, gt, ge) y los operadores de comparación generales (=, !=, <, <=, >, >=) se comportan de idéntica manera. No obstante, si uno o ambos operandos son nulos (secuencias vacías), una comparación de valores devuelve nulo, mientras que una comparación general devuelve false.

Símbolos de terminal soportados

En la tabla siguiente se identifican los símbolos de terminal soportados. Los números de símbolo de la primera columna se encuentran en http://www.w3.org/TR/xpath20/#lexical-structure.
Tabla 5. Símbolos de terminal soportados
Número Símbolo Consta de Expresión
[71] IntegerLiteral ::= Digits
[72] DecimalLiteral ::= ("." Digits) | (Digits "." [0-9]*)
[74] StringLiteral ::= ("'" (EscapeApos | [^'])* "'")
[76] EscapeApos ::= " '' "

Acceso a elementos en listas

Puede utilizar predicados para referirse a elementos de una lista (a los que a veces se hace referencia como elementos de matriz). El predicado es una expresión encerrada entre corchetes que sigue a la expresión de vía de acceso que hace referencia a la lista. Por ejemplo, si myEvent/myEventPart/theOrder/item apunta a una lista de elementos en un orden, puede hacer referencia a un elemento individual si encierra un índice numérico entre corchetes. Por ejemplo, para acceder al precio de un artículo, por ejemplo, el artículo 12, utilizaría:
myEvent/myEventPart/theOrder/item[12]/price
Las listas pueden utilizarse también como argumentos para agregar funciones. Por ejemplo, para calcular la suma de los precios de todos los pedidos, utilizaría:
fn:sum(myEvent/myEventPart/theOrder/item/price)
Para obtener más información, consulte Agregar funciones.

Funciones de constructor soportadas

Están soportadas las siguientes funciones de constructor. Las funciones de constructor son el mecanismo de XPath 2.0 que utiliza Business Monitor para dar soporte a cast. En XPath 2.0, la semántica de las funciones de constructor es equivalente al uso del operador "cast as", pero la sintaxis es diferente.
  • 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?

Las funciones de constructor booleanas con argumentos numéricos devuelven true si el argumento es distinto de cero y false si es igual a cero. Las funciones de constructor numéricas con argumento booleano devuelven 1 si el argumento es true y 0 si es false. Las funciones de constructor de entero con argumento decimal descartan las partes fraccionarios del argumento. Los constructores que convierten entre valores decimales y valores de duración correlacionan una duración de hora del día con su longitud en segundos (incluidos los segundos fraccionarios) y viceversa. Todos los constructores con argumentos de serie esperan una representación léxica válida del tipo de datos del resultado. Las funciones de constructor que devuelven un valor de serie devuelven la representación léxica canónica del argumento. El constructor dateTime con un argumento de fecha devuelve el primer instante de la fecha especificada.

Funciones generales soportadas

Se admiten el subconjunto de funciones XPath 2.0 disponibles siguiente. Las declaraciones de espacio de nombres utilizadas son xmlns:xs="http://www.w3.org/2001/XMLSchema" y xmlns:fn="http://www.w3.org/2005/xpath-functions", como en 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?

Funciones de agregación

Se admiten las cinco funciones de agregación fn:count, fn:avg, fn:max, fn:min y fn:sum (definidas en http://www.w3.org/TR/xpath-functions/#aggregate-functions), siempre que su argumento haga referencia a datos de un suceso de entrada. El argumento de fn:count() puede tener cualquier tipo. Las otras cuatro funciones deben tener argumentos numéricos.

Por ejemplo, fn:sum(myEvent/extendedData/widgetList/widget/quantity) devuelve el número total de widgets de una lista que contiene elementos de datos ampliados.

fn:avg(myEvent/listOfItems/tns:item/@tns:cost) devuelve el coste medio por artículo de una lista representada por la parte de suceso listOfItems.

Recuperación de valores QName

El valor de un atributo o elemento del suceso con un tipo de datos definido como xs:QName se recupera como una serie del formato: {namespaceName}localPart. El nombre del espacio de nombres se obtiene resolviendo el prefijo de QName, basándose en las declaraciones de espacio de nombres en el suceso. Por ejemplo, si el suceso contiene la declaración de espacio de nombres xmlns:app="http://www.my.com/my/application/namespace", el valor de QName app:customerRating se recuperará como {http://www.my.com/my/application/namespace}customerRating.

Comparación de husos horarios

Las métricas con tipos de datos de fecha, hora, o fecha-hora pueden tener un valor ajustado a un huso horario o un valor no ajustado a un huso horario. Cuando compare métricas con tipos de datos de fecha, hora o fecha-hora:
  • Ambos valores deben estar asociados a un huso horario, O
  • Ninguno de los valores debe estar asociado a un huso horario
De otro modo, se producirá un error en tiempo de ejecución cuando se realice la comparación.