Как удалить пространство имен из xml

У меня есть XML в следующем формате

<Body xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://schemas.xmlsoap.org/soap/envelope/">
  <TransactionAcknowledgement xmlns="">
    <TransactionId>HELLO </TransactionId>
    <UserId>MC</UserId>
    <SendingPartyType>SE</SendingPartyType>
  </TransactionAcknowledgement>
</Body>

Я хочу использовать для него выражение XQuery или XPath.

Теперь я хочу удалить только

xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"

пространство имен из xml.

Есть ли способ достичь этого.

Спасибо


person Pedantic    schedule 30.08.2012    source источник
comment
XPath — это язык запросов к документу(а) XML, и, таким образом, оценка выражения XPath никогда не изменяет исходный документ(ы) XML, по которому оценивается выражение. Что вам нужно, так это преобразование XML. Наиболее подходящим языком для XML-преобразований является XSLT (XQuery также можно использовать, но он очень неуклюж, поскольку в нем отсутствует сопоставление с шаблоном). Заинтересованы ли вы в XSLT-решении?   -  person Dimitre Novatchev    schedule 31.08.2012


Ответы (1)


Попробуйте использовать functx:change-element-ns-deep:

let $xml := <Body xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://schemas.xmlsoap.org/soap/envelope/">
  <TransactionAcknowledgement xmlns="">
    <TransactionId>HELLO </TransactionId>
    <UserId>MC</UserId>
    <SendingPartyType>SE</SendingPartyType>
  </TransactionAcknowledgement>
</Body>

return functx:change-element-ns-deep($xml, "http://schemas.xmlsoap.org/soap/envelope/", "")

Но, как сказал Дмитрий Новачев, эта функция не меняет пространство имен исходного xml, она создает новый XML.

person Andrei Orlov    schedule 02.09.2012