2016-06-30 3 views
0

Для всех запросов XQuery я исполняю, я определяю элемент по умолчанию пространство имен, например:Можно ли динамически объявить пространство имен по умолчанию из внешней переменной?

declare default element namespace 'http://example.com'; 
(: rest of the query :) 

Но Кодирую это пространство имен является своего рода громоздки. Могу ли я динамически определять пространство имен по умолчанию из внешней переменной?

Пробовал:

declare default element namespace $namespace; 
(: error: Expecting quote, found '$'. :) 

.. и:

declare variable $namespace external; 
declare default element namespace $namespace; 
(: error: Default declarations must be declared first. :) 

... но они не работают, к сожалению.


В настоящее время я использую BaseX 7.7.2.

ответ

1

К сожалению, можно статически объявлять пространства имен по умолчанию, так как грамматика допускает только URILiteral в этом месте. Пространство имен элементов по умолчанию находится в статическом контексте запроса.

Однако вы можете строить QNames из переменной, содержащей пространство имен, динамически (из переменной). Вы можете создавать новые элементы с такими QNames с вычисленными конструкторами элементов. Однако навигация XPath будет более сложной, потому что вам придется явно фильтровать пространства имен.

+0

Право на. Очень полезно снова; Спасибо! –

+0

Я думаю, что я просто закрою свои запросы в шаблоне общих шаблонов, поэтому я должен только объявить пространство имен в одном месте. Кроме того, я думаю, что я мог бы использовать эту общую оболочку как блок «try .. catch», а затем (относящийся к моему другому вопросу [вы ответили] (https://stackoverflow.com/a/38124483/165154)), с генератор '' в блоке 'catch'. Еще раз спасибо! –

1

Обычно считается, что если вы знаете локальные имена элементов в исходном документе статически, вы также будете знать их пространства имен статически. Это предположение не всегда корректно; вы иногда сталкиваетесь с семейством пространств имен (например, разных версий пространства имен), которые используют одни и те же локальные имена; но XQuery (и XSLT) недостаточно хорошо разработаны для обработки этого сценария.

Итак, если вы знаете имена элементов статически и используете выражения пути, такие как счет-фактура/клиент/адрес, то имена в этом пути являются просто сокращением для полных расширенных имен, и предполагается, что стенография может быть разрешен компилятором. Вот почему объявления пространств имен неподвижно статичны.

Если вы не знаете имена элементов, которые вы запрашиваете статически, то вы, вероятно, пишете запрос, который использует подстановочные знаки (например, child :: *), а не явные локальные имена, такие как «счет-фактура». В этом случае декларация пространства имен по умолчанию никогда не войдет в игру в любом случае.

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

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

  • Нет связанных вопросов^_^