Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Правильный XPath по дереву с атрибутами из ns


Автор: EgoBrain 17.10.2016, 10:02
Не удается проложить путь к значению конечного элемента, если в дерево состоит из элементов различных пространств имён.
На самом деле я точно не уверен в справедливости высказывания если.
Пытаюсь получить значение элемента 
Цитата
S:Envelope/S:Body/ns8:getPersonalCertificateBirthResponse/ns5:MessageData/ns5:AppData/ns4:certificateBirthResponseObj/ns4:certificateBirth/actRecordNumber
 но получаю все значения всех элементов документа.
Если использовать local-name()=, то значение извлекается вполне успешно.
Цитата

//*[local-name()='certificateBirthResponseObj']/*[local-name()='certificateBirth']/*[local-name()='actRecordNumber']

Почему не работает явный путь?

Вот исходный документ:
Код

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <S:Body wsu:Id="body">
        <ns8:getPersonalCertificateBirthResponse>
            <ns5:MessageData>
                <ns5:AppData Id="AppData">
                    <ns4:certificateBirthResponseObj>
                        <ns4:certificateBirth>
                            <actRecordNumber>9999</actRecordNumber>
                        </ns4:certificateBirth>
                    </ns4:certificateBirthResponseObj>                    
                </ns5:AppData>
            </ns5:MessageData>
        </ns8:getPersonalCertificateBirthResponse>
    </S:Body>
</S:Envelope>


Автор: diadiavova 17.10.2016, 12:49
EgoBrain, программа, обрабатывающая XPath должна быть извещена о значении префиксов, чтобы можно было сопоставить их пространствам имен. Судя по тому, что в соседней теме ты что-то подобное использовал в XSLT, по всей видимости именно в нем тебе это и нужно. Ну тут все просто: поскольку XSLT сам является словарем XML, стало быть правила тут те же, что и в любом XML - объяви нужные тебе пространства имен в корневом элементе преобразования и все заработает как надо.

Автор: EgoBrain 18.10.2016, 01:31
Цитата(diadiavova @ 17.10.2016,  12:49)
EgoBrain, программа, обрабатывающая XPath должна быть извещена о значении префиксов, чтобы можно было сопоставить их пространствам имен. Судя по тому, что в соседней теме ты что-то подобное использовал в XSLT, по всей видимости именно в нем тебе это и нужно. Ну тут все просто: поскольку XSLT сам является словарем XML, стало быть правила тут те же, что и в любом XML - объяви нужные тебе пространства имен в корневом элементе преобразования и все заработает как надо.

diadiavova, ты правильно заметил что в этой версии исходного документа я просто неймспейсы не объявил. На самом деле и в этой и в той теме идет работа с одним документом. Не буду же я всю партянку выкладывать, хоть там и тестовые данные.
К сожалению при корректном документе у меня и не получается достучатся до нужного элемента без использования local-name()=, что меня весьма удручает, чувствую себя не полноценным. Видимо неверно толкую мануал по XPath  smile 

Автор: EgoBrain 18.10.2016, 08:48
Цитата(diadiavova @ 17.10.2016,  20:49)
объяви нужные тебе пространства имен в корневом элементе преобразования и все заработает как надо

А да, извиняюсь, действительно упустил пару namespace-ов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)