2013-03-12 2 views
0

Я пишу библиотеку, которая генерирует сложные выражения XQuery, которые нацеливают документы из двух разных пространств имен. Однако, когда я генерирую запрос, я не знаю конкретного пространства имен для каждого элемента, который я должен запросить, поэтому я в настоящее время генерирую дизъюнкцию двух возможных комбинаций:XQuery, нацеленный на несколько пространств имен

// * [ns1: foo/ns1: bar = "some condition" или ns2: foo/ns2: bar = "some condition"]

Есть ли способ генерировать это выражение более красиво и более оптимально с точки зрения производительности?

Одно из возможных решений я нашел использовать:

объявлять элемент по умолчанию пространство имен "*"

в этом случае я мог бы просто произвести:

// * [Foo/бар = «некоторые condition "]

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

+0

бы что-то по строки '// * [local-name() = 'foo']/bar [* condition here *]' достаточно? – JWiley

ответ

0

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

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

(копирование документа при изменении всех идентификаторов URI пространства имен - или действительно любое такого алгоритмического преобразования - это в XSLT проще, чем в XQuery, но это может быть сделано в XQuery, если вы действительно хотите.)

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