Marklogic Как исключить несколько узлов в XML - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть синтаксические ошибки при исключении нескольких узлов в элементах, таких как «Источники» и «Навигаторы». Но это работает, если я исключаю только один узел, но не объединяю перед возвратом документов.

[(fn:local-name()  != ("Sources","Navigators")]

В Marklogic Qconsole:

  for $x in $uris
  let $doc := fn:doc($x)
  let $copymeta := <meta:Metadata> 
                    { $doc//meta:Metadata/*[(fn:local-name() != ("Sources","Navigators")] }
                   </meta:Metadata> 
  let $newxml := <omd:record>
                   { $copymeta }
                 </omd:record>
  return $newxml

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Оператор != имеет неинтуитивную семантику. См. этот предыдущий вопрос . Когда код находит узел *: Sources, он оценивается как != для «Навигаторов», а когда он находит узел *: Navigators, он оценивается как != для «Источников». И тогда вы получите все узлы.

Если вы не сравниваете последовательности узлов (поэтому except не вариант), тогда вместо != вы можете использовать fn:not(A = B), чтобы получить желаемый эффект. В этом случае fn:not(fn:local-name() = ("Sources","Navigators")) должен работать так, как вы ожидаете.

0 голосов
/ 09 ноября 2018

Слишком много открытых скобок перед fn:local-name().

Однако вы также можете использовать ключевое слово except и префикс подстановочного знака. Вы бы использовали это так:

for $x in $uris
let $doc := fn:doc($x)
let $copymeta := <meta:Metadata> 
                   { $doc//meta:Metadata/(* except (*:Sources, *:Navigators)) }
                 </meta:Metadata> 
let $newxml := <omd:record>
                 { $copymeta }
               </omd:record>
return $newxml

НТН!

...