2014-11-06 1 views
1

Я думаю о том, как/если XQuery можно использовать для проверки того, существует ли определенный шаблон в файле XML.Ищите определенный шаблон последовательности в 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?

Заранее благодарим за идеи!

+0

Я не получить вашу концепцию потока. Так как ваш заказ определенные в этом примере, то есть, как потоки 1, поток2, поток3 соединяются? Таким образом, поток1 начинается с элемента с id start1 из-за атрибута start. Но как он определяет, куда идти - просто используя @target (так что «поток» имеет просто два момента, начало и конец?). Но если это будет так, то какая информация делает фактически входящие и исходящие элементы? – dirkk

+0

@dirkk: указание источника/цели в элементах потока и внутри задач gh входящие/исходящие элементы, безусловно, являются дублированием информации. Тем не менее, это структура, которую специфицирует спецификация BPMN, так что это вряд ли ошибка OP. – joergl

+0

@ joergl Я не критиковал OP, я, честно говоря, не понял (и до сих пор не понимаю) синтаксиса потока здесь. Я не знаю эту спецификацию BPMN – dirkk

ответ

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/.

+0

Спасибо! Я получил эту идею и смог ее адаптировать для решения моей (реальной) проблемы. – Christian

+1

@Christian: Чтобы выразить свою благодарность, просто примите ответ. – choroba