代码之家  ›  专栏  ›  技术社区  ›  Rob Bowman

XPath基于同级值获取值-带命名空间

  •  2
  • Rob Bowman  · 技术社区  · 7 年前

    有很多答案都没有涉及名称空间,但我在名称空间方面遇到了问题。

    <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/Name='Email'所在的/ContractTransport/Value。

    下面的xpath使我可以使用ContactTransport /*[local-name()='GetServiceRequestDetailsResponse']/*[local-name()='GetServiceRequestDetailsResult']/*[local-name()='Customer']/*[local-name()='ContactTransports']/*[local-name()='ContactTransport']

    如果没有名称空间,我想我可以用[Name='Email]/*[local-Name()='Value']作为后缀,但现在不行了。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Andersson    7 年前

    你可以加上

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

    到现有XPath以获取所需的输出

        2
  •  2
  •   scrowler    7 年前

    这可能不是最优雅的选择,但这里有一个:

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

    Value a下面的元素 ContactTransport 有一个兄弟姐妹 Name 文本是 Email . Demo .