2012-04-17 2 views
1

Мне нужно сопоставить шаблоны на множестве XML-документов (все с одной и той же схемой), и когда шаблон соответствует, мне нужно получить содержимое и выполнить некоторые конкретные преобразования на нем.XML-набор формул соответствия шаблону

У меня есть список тех «шаблонов», которые похожи на регулярные выражения, но с элементами и атрибутами.

псевдо-паттерн пример:

(//ELEMENTx) (node())* (//ELEMENTy[@ATTRIBUTEz]) (node())* (//@ATTRIBUTEw) 

Я использовал синтаксис XPath внутри только круглые скобки. Можно использовать и другие квантификаторы ...

Это будет соответствовать тому, когда xml имеет ELEMENTx в качестве первого элемента, заканчивается одним элементом с ATTRIBUTEw, а между ними должен быть ELEMENTy с ATTRIBUTEz.

Обратите внимание, что мне нужно сопоставить весь документ для каждого целого рисунка, а не только его части.

Вложение элементов в этом случае не имеет значения (ELEMENTy может быть дочерним элементом ELEMENTx, или нет), но они должны иметь этот конкретный порядок.

EDIT: Чтобы уточнить, в XML есть деревья с синтаксической информацией. Мне нужно сопоставить синтаксические шаблоны.

Пример:

 
    TOP 
    /\ 
    X Y 
    |\ |\ 
    1 2 3 4 

Соответствующие модели могут быть (имена узлов, при условии отсутствия атрибутов):
XY
1 * Y
Х 3 4
1 * 4


Я мог бы использовать XPath для получения каждой отдельной части шаблона, но тогда я теряю чувство порядка ... если я это сделаю два запроса XPath, я не знаю позиции результатов относительно друг друга.

После сопоставления у меня будут правила для каждого шаблона, которые задают некоторые преобразования в содержании (порядок изменения и т. Д.).

Есть ли способ сделать что-то подобное с помощью XPath или XQuery? Я мог бы использовать DOM и сам сделать код соответствия шаблону, но, возможно, уже есть лучший способ сделать это.

Спасибо за любые указатели.

ответ

1

Мне нужно сопоставить шаблоны на множестве XML-документов (все с той же схемой), и когда шаблон соответствует, мне нужно получить содержимое и выполнить некоторые конкретные преобразования на нем.

До сих пор это звучит как довольно хорошее описание XSLT. Пока вы не скажете, что хотите, чтобы правило соответствовало последовательности узлов, а не одному узлу.

Но если последовательность узлов, которые вы сопоставляете, представляет собой последовательность дочерних элементов какого-либо родительского узла, вы можете переделать это как правило для соответствия родительскому узлу.

Язык, соответствующий шаблону в XSLT, не такой мощный, как вы ищите, но он может быть адаптирован к вашим потребностям. Две возможности, которые приходят на ум, - это (а) преобразовать структурную информацию, которую вы хотите сопоставить, в строку и использовать регулярное выражение для оценки строки или (b) написать определение сложного типа XSD для грамматики, которую вы хотите сопоставить и использовать возможность проверки XSLT по типу (в сочетании с попыткой/улов XSLT 3.0), чтобы проверить, соответствует ли последовательность узлов указанному сложному типу в схеме.

+0

Мне нужно сопоставить последовательность узлов, потому что XML представляет собой синтаксическую информацию для естественного языка, поэтому он имеет дерево и зависимости. Для этого мне нужно сопоставить последовательность узлов и атрибутов в дереве. Зависимости - еще одна отдельная проблема. Теперь шаблоны не должны указывать определенную родительскую/дочернюю структуру, но порядок важен. В некотором смысле последовательность представляет собой последовательность дочерних элементов верхнего узла, но регулярное выражение усложняет ситуацию. – CoolkcaH

+0

См. Пример, который я добавил к вопросу для уточнения. Я увижу, могу ли я сделать это с родительскими правилами соответствия, как вы говорите ... Преобразование в строку, а затем использование регулярного выражения - это первое, что мне нужно делать, но оно может легко стать более сложным, и я хотя, возможно, решение существует в XPath или XQuery. О типах XSD, возможно, он может работать, но я не могу использовать Saxon-PE для этого (академический проект, без бюджета), поэтому нет 3.0 для меня ... – CoolkcaH

+0

Я пытаюсь изучить XPath в этом процессе, и я просто нашел функцию op: node-before и << operator, которая, я думаю, могла бы быть использована для этого, чтобы представить * в моих примерах шаблонов. Как вы думаете? – CoolkcaH

Смежные вопросы