Мне нужно сопоставить шаблоны на множестве 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 и сам сделать код соответствия шаблону, но, возможно, уже есть лучший способ сделать это.
Спасибо за любые указатели.
Мне нужно сопоставить последовательность узлов, потому что XML представляет собой синтаксическую информацию для естественного языка, поэтому он имеет дерево и зависимости. Для этого мне нужно сопоставить последовательность узлов и атрибутов в дереве. Зависимости - еще одна отдельная проблема. Теперь шаблоны не должны указывать определенную родительскую/дочернюю структуру, но порядок важен. В некотором смысле последовательность представляет собой последовательность дочерних элементов верхнего узла, но регулярное выражение усложняет ситуацию. – CoolkcaH
См. Пример, который я добавил к вопросу для уточнения. Я увижу, могу ли я сделать это с родительскими правилами соответствия, как вы говорите ... Преобразование в строку, а затем использование регулярного выражения - это первое, что мне нужно делать, но оно может легко стать более сложным, и я хотя, возможно, решение существует в XPath или XQuery. О типах XSD, возможно, он может работать, но я не могу использовать Saxon-PE для этого (академический проект, без бюджета), поэтому нет 3.0 для меня ... – CoolkcaH
Я пытаюсь изучить XPath в этом процессе, и я просто нашел функцию op: node-before и << operator, которая, я думаю, могла бы быть использована для этого, чтобы представить * в моих примерах шаблонов. Как вы думаете? – CoolkcaH