У меня есть этот файл, в котором есть пространства имен, я пытаюсь написать Xquery, который будет возвращаться, последний узел имеет пространство имен, но не может найти логику для возврата узла пространства имен (PS: я новичок в Xquery)
XML-файл -
<XML>
<SOAPMessage>
<soapenv:Envelope xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<postRequestResponse xmlns = "http://company.com">
<postRequestReturn>
<OnlineBRE xmlns = "">
<Proccode>NUM</Proccode>
</OnlineBRE>
</postRequestReturn>
</postRequestResponse>
</soapenv:Body>
</soapenv:Envelope>
</SOAPMessage>
</XML>
Я пробовал запрос на возврат узла с точным строковым значением, но это не сработало.
Вы можете найти все элементы в документе //*
и проверить, есть ли namespace-uri()
в фильтре предикатов, а затем выбрать элемент last()
, у которого есть namespace-uri()
.
let $doc :=
<XML>
<bk:BOOK xmlns:bk = "urn:example.microsoft.com:BookInfo" xmlns:money = "urn:Finance:Money">
<bk:TITLE>value1</bk:TITLE>
<ONLINEBRE />
<bk:PRICE money:currency = "US Dollar">22.95</bk:PRICE>
</bk:BOOK>
</XML>
return ($doc//*[namespace-uri()])[last()]
Это вернет все элементы после последнего элемента пространства имен, как получить значение узла, имеющего последнее пространство имен, это способ в Xquery получить путь узла с последним пространством имен @MadsHansen
Я не понимаю, что вы имеете в виду. Вы спрашиваете родителя этого элемента? Будет проще, если вы укажете, что вы на самом деле хотите, приведите пример из своего образца XML.
Я ввел точный xml, для которого мне нужна помощь, Мэдс, поскольку последнее, у которого есть пространство имен, — ONLINEBRE, поэтому я хочу, чтобы ответ был только «ONLINEBRE» или XPATH тега <ONLINE BRE xmlns = "">
этот элемент не имеет пространства имен. Вы сказали, что хотите выбрать последний элемент с пространством имен. Итак, если вы хотите выбрать ONLINEBRE
, в чем логика?
Мне нужно значение тега с последним пространством имен, скажем, я хочу, чтобы ответ был <postRequestResponse>
Я добавил новый XML
postRequestReturn
привязан к тому же пространству имен, что и postRequestResponse
, поэтому на самом деле это последний элемент, у которого есть пространство имен. Вы ищете последний элемент, который имеет @xmlns:*
?? Это не обычный атрибут, поэтому вы не можете выбрать его с помощью XPath, как это можно сделать с «настоящими» атрибутами. Все еще пытаетесь понять, чего вы хотите достичь и почему.
Давайте продолжим обсуждение в чате.
Мне нужно не значение, а имя элемента, например, в вашем первом комментарии, я хочу, чтобы ответ был <bk:PRICE>
Основываясь на ваших комментариях к ответу Мэдса Хансена, я пришел к следующему:
declare namespace array = "http://www.w3.org/2005/xpath-functions/array";
declare function local:ns-changed ($current as element(), $last-ns, $last-element) {
$current/element() ! (
let $child-ns := namespace-uri-from-QName(node-name(.))
return
if ( $child-ns = $last-ns )
then local:ns-changed(., $last-ns, $last-element)
else local:ns-changed(., $child-ns, .)
),
$last-element
};
let $root :=
<XML>
<SOAPMessage>
<soapenv:Envelope xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<postRequestResponse xmlns = "http://company.com">
<postRequestReturn>
<OnlineBRE xmlns = "">
<Proccode>NUM</Proccode>
</OnlineBRE>
</postRequestReturn>
</postRequestResponse>
</soapenv:Body>
</soapenv:Envelope>
</SOAPMessage>
</XML>
let $initial-ns := namespace-uri-from-QName(node-name($root))
let $wanted := head(local:ns-changed($root, $initial-ns, $root))
return $wanted
Возможно, я некрасивый и неэффективный, а также тестировался только на предоставленном вами вводе, но он делает то, что вы хотите.
Здесь вы можете увидеть это в действии https://xqueryfiddle.liberty-development.net/3Nzd8c9/1
В настоящее время он возвращает последний элемент, в котором изменилось пространство имен. Чтобы вернуть имя узла, значение или что-то еще, измените последнюю строку.
Задавая вопрос XQuery, вам необходимо предоставить минимальный воспроизводимый пример: (1) Входной XML. (2) Ваша логика и XQuery, который пытается ее реализовать. (3) Желаемый результат на основе № 1 выше. (4) Процессор XQuery и его соответствие стандартам XQuery: 1.0, 3.0, 3.1 или 4.0.