【问题标题】:Look for a defined sequence-pattern in XML在 XML 中查找已定义的序列模式
【发布时间】:2014-11-06 13:02:49
【问题描述】:

我正在考虑如何/是否可以使用 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 做到这一点?

提前感谢您的想法!

【问题讨论】:

  • 我不太明白你的流程概念。那么在这个例子中你的顺序是如何定义的,即 flow1、flow2、flow3 如何互连?因此,由于 start 属性,flow1 从 id start1 的元素开始。但是它如何确定去哪里 - 只需使用 @target (所以“流”只有两个点,开始和结束?)。但如果是这样的话,传入和传出元素实际上传递了哪些信息?!
  • @dirkk:通过传入/传出元素在流程元素和任务内部指定源/目标肯定是信息重复。然而,这是 BPMN 规范要求的结构,所以这不是 OP 的错。
  • @joergl 我没有批评 OP,老实说,我没有(现在仍然不)理解这里的流语法。我不知道这个 BPMN 规范

标签: xml xpath xml-parsing xquery bpmn


【解决方案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/

【讨论】:

  • 谢谢!我得到了这个想法,并且能够对其进行调整以解决我的(实际)问题。
  • @Christian:为了表达你的感激,请接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多