我的理解是,由于每个状态转换都具有一个当前状态和一个将来状态(成功时),因此生成的CPF管道将是线性的,如文档所示:
https://docs.marklogic.com/guide/cpf/pipelines#id_42403
一个状态是否可能有条件地转换为一个状态或另一状态(分支)?使用上面的示例,是否可以根据某些条件从状态B转换为状态C或状态F? answer (by @rjrudin)提出了通过操纵域的方法。
如果可以实现分支,是否有可能过渡到先前的状态(循环)?例如,有条件地从状态K过渡到状态B或状态L。这样可以进行一些迭代处理。
答案 0 :(得分:2)
在特定状态转换的定义中可能有条件/动作对。 CPF确实不在乎您的管道是线性的还是循环的:它只是查看文档的当前状态并对其执行条件来决定下一步要做什么。
如果您想查看循环管道的示例,则“ PDF转换(图像批处理)”管道循环(Installer / conversion / alternatives / batched-pdf-pipeline.xml中的源)。诀窍是在两个不同的状态之间循环:某些优化可能会挫败尝试回到相同状态的尝试。
答案 1 :(得分:1)
看看这个简单的示例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
函数具有第三个参数(此处为空序列),可让您提供目标状态的替代。使用该参数,可以将文档转换为所需的任何状态。
但是请小心,如果您不小心,很容易创建无限循环(通过指向之前已经通过的状态),或者中途出现死角(错误输入的状态名称导致其不再得到进一步处理) ..
HTH!