• This is even more straight forward to do using the row_number function and set the order to select Current first if it exists, here is a quick sample

    😎

    USE tempdb;

    GO

    SET NOCOUNT ON;

    GO

    DECLARE @TXML XML = N'

    <Persons>

    <Person ID="776">

    <EmailAddress>abc@abc.com</EmailAddress>

    <NotifyElectronically>0</NotifyElectronically>

    <InactiveAttorney>false</InactiveAttorney>

    <PhoneNumber>127</PhoneNumber>

    <PhoneNumber Current="true">258</PhoneNumber>

    <PhoneNumber>123</PhoneNumber>

    <HouseNumber>369</HouseNumber>

    </Person>

    <Person ID="777">

    <EmailAddress>abcd@abc.com</EmailAddress>

    <NotifyElectronically>0</NotifyElectronically>

    <InactiveAttorney>false</InactiveAttorney>

    <PhoneNumber>123</PhoneNumber>

    <PhoneNumber>393</PhoneNumber>

    <HouseNumber>369</HouseNumber>

    </Person>

    </Persons>

    ';

    ;WITH BASE_DATA AS

    (

    SELECT

    PERSON.DATA.value('@ID','INT') AS ID

    ,ROW_NUMBER() OVER

    (

    PARTITION BY PERSON.DATA.value('@ID','INT')

    ORDER BY ISNULL(PHONE.DATA.value('@Current','VARCHAR(10)'),'0') DESC

    ) AS PHONE_RID

    ,PERSON.DATA.value('EmailAddress[1]','VARCHAR(100)') AS EmailAddress

    ,PERSON.DATA.value('NotifyElectronically[1]','TINYINT') AS NotifyElectronically

    ,PHONE.DATA.value('../PhoneNumber[1]','VARCHAR(25)') AS PhoneNumber

    ,PHONE.DATA.value('@Current','VARCHAR(10)') AS [Current]

    FROM @TXML.nodes('Persons/Person') AS PERSON(DATA)

    OUTER APPLY PERSON.DATA.nodes('PhoneNumber') AS PHONE(DATA)

    )

    SELECT

    BD.ID

    ,BD.EmailAddress

    ,BD.NotifyElectronically

    ,BD.PhoneNumber

    ,ISNULL(BD.[Current],'false') AS [Current]

    FROM BASE_DATA BD

    WHERE BD.PHONE_RID = 1;

    Results

    ID EmailAddress NotifyElectronically PhoneNumber Current

    ---- -------------- -------------------- ------------ --------

    776 abc@abc.com 0 127 true

    777 abcD@abd.com 0 123 false