2014-08-29 3 views
0

Существует хорошо известный тождественное преобразование пример кода в XQuery wikibookIndentity Transform с пространствами имен

Но он хорошо работает только без каких-либо пространства имен документов, или явно объявляя пространства имен с одинаковыми префиксами, используемых в документе о подлежащих обработке ,

Если вы не объявить пространство имен (с теми же приставками), вы получите сообщение об ошибке:

Cannot compile xquery: err:XPST0081 No namespace defined for prefix xsd [at line 15, column 12]

есть способ, чтобы написать тождественное преобразование в XQuery, который может автоматически обрабатывать пространство имен и префиксы, избегая явного объявления пространств имен?

EDIT:

Это код из Wikibook:

(: return a deep copy of the element and all sub elements :) 
declare function local:copy($element as element()) as element() { 
    element {node-name($element)} 
     {$element/@*, 
      for $child in $element/node() 
       return 
       if ($child instance of element()) 
       then local:copy($child) 
       else $child 
     } 
}; 

В моем случае, я не знаю имен или префиксов в документе должны быть обработаны, поэтому element { } { } конструкция терпит неудачу если пространство имен и префикс не объявлены в XQuery.

Чтобы воспроизвести его, просто скопируйте/вставьте его и запустите с документом, который использует префиксные пространства имен.

+1

Этого не было в моем опыте. можете ли вы разместить свой код и контент? – joemfb

+0

Думаю, вам придется вставить пример вашего XML. Я просто проверил ваш XQuery, и он отлично работает для меня с пространствами имен с префиксами и без них. – adamretter

+0

Попробуйте так: let $ x: = doc ('http://docs.oasis-open.org/ubl/os-UBL-2.1/xsd/maindoc/UBL-Order-2.1.xsd') return local: copy ($ x) Помните, что я использую eXist-db –

ответ

0

Я думаю, что ответ отрицательный. Если вы хотите обрабатывать элементы с именами, то эти пространства имен должны быть объявлены.

+0

В этом случае, что делать, если вы знаете пространства имен документа, но не используемые префиксы? –

+2

@BillVelasquez На самом деле, я не могу воспроизвести эту проблему. Если вы хотите выбрать элементы (например, '// some-prefix: some-local-name'), то' some-prefix' должен быть объявлен в связи с пространством имен элементов, которые вы собираетесь выбрать (независимо от его префикса) , Однако, если вы просто копируете элементы с использованием преобразования идентификаторов, каждый элемент будет «знать» его пространство имен, и при создании его автоматически добавляется объявление префикса. Можете ли вы опубликовать простой пример, который воспроизводит вашу проблему? – wst

0

На основании сообщения об ошибке все, что вам нужно сделать, это объявить пространство имен xsd в верхней части вашего документа XQuery.

Declare namespace xsd="http://www.w3.org/2001/XMLSchema";

Если это не так, то размещение XQuery поможет нам понять, в чем проблема.

+0

Этого я хочу избежать, потому что я заранее не знаю пространства имен и префиксы в документе –

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