MarkLogic 内容处理框架 (CPF) 管道必须是线性的还是非循环的?
Does MarkLogic Content Processing Framework (CPF) pipeline has to be linear or acyclic?
我的理解是,由于每个状态转换都有一个当前状态和一个未来状态(成功时),因此生成的 CPF 管道将是线性的,如文档中所示:
https://docs.marklogic.com/guide/cpf/pipelines#id_42403
一个状态是否可以有条件地过渡到一个状态或另一个状态(分支)?使用上面的示例,是否可以根据某些条件从状态 B 过渡到状态 C 或状态 F? answer (by @rjrudin) 通过操纵域建议了一条路线。
如果可以实现分支,是否可以过渡到前一个状态(循环)?例如,有条件地从状态 K 转移到状态 B 或状态 L。这将启用一些迭代处理。
看看这个简单的 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!
在特定状态转换的定义中可以有 condition/action 对。 CPF 真的不关心你的管道是线性的还是循环的:它只是查看文档的当前状态并执行其上的条件来决定下一步做什么。
如果您想查看循环管道的示例,"PDF Conversion (Image Batching)" 管道循环(源代码在 Installer/conversion/alternatives/batched-pdf-pipeline.xml 中)。诀窍是在两个不同的状态之间循环:某些优化可能会阻止循环回到相同状态的尝试。
我的理解是,由于每个状态转换都有一个当前状态和一个未来状态(成功时),因此生成的 CPF 管道将是线性的,如文档中所示:
https://docs.marklogic.com/guide/cpf/pipelines#id_42403
一个状态是否可以有条件地过渡到一个状态或另一个状态(分支)?使用上面的示例,是否可以根据某些条件从状态 B 过渡到状态 C 或状态 F? answer (by @rjrudin) 通过操纵域建议了一条路线。
如果可以实现分支,是否可以过渡到前一个状态(循环)?例如,有条件地从状态 K 转移到状态 B 或状态 L。这将启用一些迭代处理。
看看这个简单的 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!
在特定状态转换的定义中可以有 condition/action 对。 CPF 真的不关心你的管道是线性的还是循环的:它只是查看文档的当前状态并执行其上的条件来决定下一步做什么。
如果您想查看循环管道的示例,"PDF Conversion (Image Batching)" 管道循环(源代码在 Installer/conversion/alternatives/batched-pdf-pipeline.xml 中)。诀窍是在两个不同的状态之间循环:某些优化可能会阻止循环回到相同状态的尝试。