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