Взгляните на этот простой пример модуля действий CPF:
xquery version "1.0-ml";
import module namespace cpf="http://marklogic.com/cpf"
at "/MarkLogic/cpf/cpf.xqy";
declare variable $cpf:document-uri as xs:string external;
declare variable $cpf:transition as node() external;
if (cpf:check-transition($cpf:document-uri,$cpf:transition)) then try {
let $doc := fn:doc($cpf:document-uri)
return
xdmp:node-insert-child(
$doc/book,
<last-updated>{fn:current-dateTime()}</last-updated>
),
xdmp:log( "add last-updated ran OK" ),
cpf:success($cpf:document-uri, $cpf:transition, ())
} catch ($e) {
cpf:failure($cpf:document-uri, $cpf:transition, $e, ())
}
else ()
(Скопировано из руководства CPF: https://docs.marklogic.com/guide/cpf/quickStart#id_76015)
Это вызов cpf:success
и cpf:failure
, которые определяют, какое состояние будет применено следующим. Однако функция cpf:success
имеет 3-й параметр (здесь - пустая последовательность), который позволяет предоставить переопределение для целевого состояния. Используя этот параметр, вы можетепереведите документ в любое состояние, которое вам нравится.
Будьте осторожны, вы можете легко создавать бесконечные циклы (указывая назад на состояние, которое вы уже передали ранее), или тупики на полпути (из-за опечаток имен состояний, вызывающихэто не обрабатывается дальше), если вы не будете осторожны ..
HTH!