Notas del Motor de Script Versión 2 y Notas Anteriores
El proceso de scripting que utiliza la versión de motor 2 o superior del motor requiere una sintaxis adicional que permite aprovechar la funcionalidad de XPath 2. En general, cualquier variable declarada se considerará una cadena. Es decir, si la intención es crear un estado de cuenta matemático, es necesario declarar explícitamente el tipo de datos de las variables, como enteros, números o fechas.
Aritmética de Fecha y Hora
Los tipos de datos de intervalo y de fecha y hora de XPath soportan funciones y operaciones aritméticas ('+', '-', '*', etc.) que se puede utilizar para realizar cálculos de tiempo de la misma manera que se utiliza '1 + xs:integer(value)' para cálculos numéricos.
Comparación de duración:
if ("(xs:dateTime(fn:current-dateTime()) - xs:dateTime($updateDateTimeX))
ge xs:dayTimeDuration(concat('PT', BO/hoursBetweenStatisticsUpdate, 'H'))")
goto 60;
end-if;
Comparación de fechas:
if ("xs:date(parm/endDate) < xs:date(parm/startDate)")
terminate with error (11108, 11507 element='endDate');
end-if;
Comparación de una fecha con la fecha actual:
if ("xs:date(parm/startDate) <= xs:date($CURRENT-DATE)")
terminate with error (11108, 11507 element='endDate');
end-if;
Cálculo de fin de mes:
// covert to ISO
move "concat($year,'-',$mon2,'-01T00:00:00')" to $monthStart;
// calculate
move "xs:dateTime($monthStart) + xs:yearMonthDuration('P1M') - xs:dayTimeDuration('P0DT1S')"
to $monthEnd;
// convert from ISO to OUAF
move "concat($year,'-',$mon2,'-',substring(string($monthEnd),9,2),'-23.59.59')" to $endDateTime;
Comparación de Fechas y Horas en Formato de Cadena
El formato de cadena similar a ISO para la fecha y la hora conserva la siguiente secuencia, que se rellena con ceros: AAA MM DD HH MM SS. Independientemente de los separadores, este formato será apropiado para las operaciones de comparación. En particular, los valores de fecha y hora en el formato del marco “AAAA-MM-DD.HH.MM.SS” se pueden utilizar con los operadores “=”, “!=”, así como con “>”, “>=”, “<”, “<=”.
// retrieve framework date/time value
invokeBS 'CM-MAXMSRMT' using "CM-MAXMSRMT";
move "string(cm-MAXMSRMT/results[1]/measurementDateTime)" to $lastMsmtDT;
// construct another date/time
move "concat($year,'-01-01-00.00.00')" to $startDateTime;
// compare using string operators
if ("$lastMsmtDT >= $startDateTime")
move "substring($lastMsmtDT,1,4)" to $latestMsrmtYear;
Conversión de Fechas y Horas entre el Marco e ISO
Solamente es necesario convertir las fechas y las horas del formato del marco a ISO para las operaciones aritméticas de fecha y hora. Las comparaciones se pueden realizar directamente con el formato del marco. La única diferencia que existe entre el formato de fecha y hora del marco e ISO son los separadores:
Marco: “AAAA-MM-DD.HH.MM.SS”
ISO: “AAAA-MM-DDTHH:MM:SS”
Ejemplo de conversión del formato del marco a ISO:
move "concat(substring($ouafDT, 1, 10), 'T', translate(substring($ouafDT, 12),'.',':'))" to $isoDT;
Ejemplo de conversión de ISO al formato del marco:
move "concat(substring($isoDT, 1, 10), '.', translate(substring($isoDT, 12),':','.'))" to $ouafDT;
Redondeo de Dinero con una Escala Dinámica de Divisa
Dado que diferentes divisas soportan diferentes cantidades de decimales, el marco proporciona una API para redondear un importe monetario en función de una divisa determinada.
move "parm/amount" to $qnty;
move "currency/decimals" to $decimals;
move "fn:round(xs:decimal($qnty) * math:exp10(xs:double($decimals)))
div math:exp10(xs:double($decimals))" to "parm/roundedAmount";
Ciclo a través de las secuencias
En XPath 2, se puede organizar un ciclo sobre una secuencia de enteros, no solo una lista de nodos.
En el ejemplo, se muestra un ciclo sobre un rango de meses. Esta es una creación de formación de secuencias en XPath. La lista de nodos de XPath que conocemos es otro tipo de secuencia.
for ($month in "1 to 12")
En este ejemplo se muestra un ciclo sobre un rango de años determinado en orden descendente:
for ($year in "fn:reverse(parm/startYear to parm/endYear)")
move "concat($year,'-01-01-00.00.00')" to $startDateTime;
move "concat($year,'-12-31-23.59.59')" to $endDateTime;
...
En este ejemplo se muestra un ciclo a través de una lista de nodos con ‘índice’ que permite acceder a otras listas de nodos:
for ($idx in "1 to count(parm/touData/touList)")
move "parm/touData/touList[$idx]" to $tou; // access any list with this index
La sintaxis anterior se puede utilizar como una alternativa elegante para mantener los índices por separado, por ejemplo, en lugar de lo siguiente:
move “0” to $idx;
for ($item in "parm/touData/touList")
move “1 + xs:integer($idx)” to $idx;
Relleno de Cadenas y Formato Decimal
Esto se utiliza con formatos de entrada o de salida específicos. Se puede aplicar al cero, al espacio y a otros tipos de relleno.
En este ejemplo se muestran los prefijos para los componentes de fecha y hora, como la producción de “2010-01-02” en lugar de “2010-1-2”.
move "substring(concat('0',string($month)), string-length(string($month)), 2)" to $mon2;
En este ejemplo se muestra el sufijo que permite agregar la alineación rellenada con ceros decimales, como la producción de “12.30” y “4.00” en lugar de “12.3” y “4”. En el ejemplo se realizan tres tareas: redondeo a 2 decimales, inserción de un punto si es necesario y relleno con ceros.
// round and zero-pad to 2 decimals
move "$item/amount" to $qty;
move "fn:round(xs:double($qty) * 100) div 100" to $qty;
move "string($qty)" to $qty;
move "concat(substring-before(concat($qty,'.'),'.'),'.',substring(concat(substring-after($qty,'.'),'00'),1,2))" to $qty;
Operación ternaria
Esto permite elegir valores en función de una condición, de modo que se puede utilizar como una sola expresión en lugar de un bloque if/else. Se conoce en C/C++ como ‘cond ? value1 : value2’ o en BASIC, como ‘IFF(cond, value1, value2)’. En XPath, la sintaxis es la siguiente: "if (cond) then value1 else value2". Tenga en cuenta que este no es el bloque de scripting condicional de nivel superior.
En XPath, es una expresión que se puede combinar con otras expresiones. En el proceso de scripting, se puede usar de la siguiente manera:
move "if (string(D1-UnitOfMeasure/measuresPeakQuantity) = 'D1MP') then 'D1MX' else 'D1SM' " to $func;
Procesamiento de canalización-363.3
En el proceso de scripting, no es fácil crear un simple código reutilizable, ya que no hay funciones locales, y una llamada de script independiente significa un gasto de códigos y requiere parámetros de empaquetamiento y desempaquetamiento. Para evitar tener que copiar y pegar el mismo bloque de código entre destinos de script similares, considere la ‘canalización’, es decir, divida el proceso total en diferentes pasos de nivel superior, algunos de los cuales se pueden compartir en rutas alternativas. Esto es común en la preparación de parámetros y el formato de salida. Un resultado intermedio entre las etapas se puede almacenar en una estructura de “parámetro”.
En lugar de este código:
|
Considere esta alternativa:
|
Funciones de XPath 2
El motor de script versiones 2 y superiores soporta las Funciones y los Operadores de XQuery 1.0, y la versión standard de XQuery 1.0 con algunas mínimas limitaciones. A continuación, se proporcionan los URL de ambas especificaciones. El primer enlace tiene las funciones y los operadores disponibles para usar en XQuery.
-
http://www.w3.org/TR/xpath-functions/
-
http://www.w3.org/TR/xquery/
Los siguientes tienen acceso a sistemas de archivos locales solamente. (Para otros protocolos, como http, devolverán una secuencia vacía):
-
fn:doc
-
fn:collection