XPath Получить значение, основанное на значении родства - с пространством имен

10 просмотра

2 ответа

Есть много ответов без каких-либо пространств имен, но у меня возникают проблемы с пространством имен.

Вот документ xml:

<GetServiceRequestDetailsResponse xmlns="http://lcc.catscrm">
<GetServiceRequestDetailsResult xmlns:a="http://schemas.datacontract.org/2004/07/LCC.CATS.CRM.WCF.Model" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:AltRefs>
        <a:AltRefModel>
            <a:Name>UTRN</a:Name>
            <a:TypeId>7577</a:TypeId>
            <a:Value>9024930</a:Value>
        </a:AltRefModel>
    </a:AltRefs>
    <a:Customer>
        <a:Address>
            <a:Address1>5</a:Address1>
            <a:Address2>Random</a:Address2>
            <a:County>West Yorks</a:County>
            <a:NumberName>5</a:NumberName>
            <a:Postcode>L1</a:Postcode>
            <a:TownCity>London</a:TownCity>
            <a:UPRN i:nil="true"/>
        </a:Address>
        <a:AltRefs/>
        <a:ContactTransports>
            <a:ContactTransport>
                <a:Name>MobileNumber</a:Name>
                <a:TypeId>3</a:TypeId>
                <a:Value>08965</a:Value>
            </a:ContactTransport>
            <a:ContactTransport>
                <a:Name>Email</a:Name>
                <a:TypeId>1</a:TypeId>
                <a:Value>a@b.com</a:Value>
            </a:ContactTransport>
        </a:ContactTransports>
        <a:CustomerUPRN i:nil="true"/>
        <a:FirstName>Rob</a:FirstName>
        <a:Id i:nil="true"/>
        <a:LastName>Bowman</a:LastName>
    </a:Customer>
</GetServiceRequestDetailsResult>

Мне нужно получить / ContractTransport / Value, где / ContractTransport / Name = 'Email'.

Следующий xpath приводит меня к ContactTransport /*[local-name()='GetServiceRequestDetailsResponse']/*[local-name()='GetServiceRequestDetailsResult']/*[local-name()='Customer']/*[local-name()='ContactTransports']/*[local-name()='ContactTransport']

Если бы не было пространств имен, я предполагаю, что могу суффикс с [Name = 'Email] / * [local-name () =' Value '], но теперь это не работает.

Автор: Rob Bowman Источник Размещён: 17.05.2019 03:42

Ответы (2)


0 плюса

Можете добавить

/*[local-name()="Value" and preceding-sibling::*[local-name()="Name" and .="Email"]]

для вашего существующего XPath для получения требуемого результата

Автор: Andersson Размещён: 15.11.2018 12:08

0 плюса

Это может быть не самый элегантный вариант, но вот один из них:

//*[local-name()='ContactTransport']/*[local-name()='Value' and ../*[local-name()='Name' and text()='Email']]

Это выберет все Valueэлементы под ним, у ContactTransportкоторых есть брат, Nameтекст которого есть Email.

Автор: Robbie Averill Размещён: 15.11.2018 12:10
Вопросы из категории :
32x32