在XML中查找已定义的序列模式

时间:2014-11-06 13:02:49

标签: xml xpath xml-parsing xquery bpmn

我正在考虑如何使用XQuery来检查XML文件中是否存在特定模式。

示例: 想象一下代表流程的(简化)XML(StartEvent> UserTask> AutoTask> EndEvent)。

<process>
<startEvent id="start1">
    <outgoing>flow1</outgoing>
</startEvent>

<userTask id="user1">
    <incoming>flow1</incoming>
    <outgoing>flow2</outgoing>
</userTask>

<autoTask id="auto1">
    <incoming>flow2</incoming>
    <outgoing>flow3</outgoing>
</autoTask>

<endEvent id="end1">
    <incoming>flow3</incoming>
</endEvent>
<flow id="flow1" source="start1" target="user1"/>
<flow id="flow2" source="user1" target="auto1"/>
<flow id="flow3" source="auto1" target="end1"/>
</process>

现在我想检查文件中的某个地方是否为“userTask”类型的元素,紧接着是“autoTask”类型的元素。请注意,需要通过传入/传出流定义来检查此序列,而不能从文档中的顺序派生。

有没有办法用xquery / xpath做到这一点?

提前感谢您的想法!

1 个答案:

答案 0 :(得分:1)

以下XPath 1.0查询列出了源为用户任务且目标为自动任务的所有流:

//flow[@source=//userTask/@id and @target=//autoTask/@id]

或者,没有后代:

/process/flow[@source=/process/userTask/@id and @target=/process/autoTask/@id]

或者,由于XML中的信息是多余的,您可以反过来询问。

//userTask[outgoing=//autoTask/incoming]

它列出了某些自动任务的传出流量传入的所有用户任务(同样,您可以将//替换为/process/