Как получить все объявления пространства имен одного элемента XML - PullRequest
0 голосов
/ 23 октября 2018

Как я могу использовать запрос XPath (или даже XQuery), чтобы получить объявление префикса nampespace для одного элемента?Я хочу проверить, определены ли они более чем на 1 месте.

Например, для первого элемента это будут xmlns и xmlns: n, для второго только xmlns;для первого это было бы ничего и т. д.

Я могу найти только эти Я могу использовать только пространства имен, но не совсем то, что я ищу.

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <plus xmlns="http://lalaivana.me/calc/"
            xmlns:n="http://lalaivana.me/numbers/" >
            <n:int value="4"/>
            <n:int value="5"/>
        </plus>
        <plus xmlns="http://lalaivana.me/calc/">
            <int value="4" xmlns="http://lalaivana.me/numbers/" />
            <int value="5"/>
        </plus>
    </root>

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете использовать функции in-scope-prefixes() и namespace-uri-for-prefix() для получения префикса namespace-prefix и namespace-uri для внутренних пространств имен, связанных с элементом..

for $element in $doc//*
return 
  for $prefix in fn:in-scope-prefixes($element)
  return string-join( (name($element), $prefix,fn:namespace-uri-for-prefix($prefix, $element) ), "|")

Обратите внимание, что пространство имен XML http://www.w3.org/XML/1998/namespace будет включено с префиксом xml.Вы можете исключить его с помощью фильтра предикатов:

for $element in $doc//*:plus[2]
return 
  for $prefix in fn:in-scope-prefixes($element)[not(. eq 'xml')]
  return string-join((name($element), $prefix,fn:namespace-uri-for-prefix($prefix, $element)), "|")
...