You can isolate the <p> tag in the nodes path and simplify your SELECT.
This gives a list of all Countries and Capitals:
SELECT
T.c.value('(Name)[1]','nvarchar(100)') AS Country
,T.c.value('(Val)[1]','nvarchar(100)') AS Capital
FROM
@MyXML.nodes('/pairs/p') T(c)
The syntax is no different in the WHERE clause, so you can just apply a parameter there:
declare @param nvarchar(100) = 'England'
SELECT
T.c.value('(Val)[1]','nvarchar(100)') AS Capital
FROM
@MyXML.nodes('/pairs/p') T(c)
WHERE T.c.value('(Name)[1]','nvarchar(100)') = @Param
Here is a complete test script that does both.
declare @MyXML xml;
SET @MyXML =
'
<pairs>
<p>
<Name>France</Name>
<Val>Paris</Val>
</p>
<p>
<Name>England</Name>
<Val>London</Val>
</p>
<p>
<Name>Spain</Name>
<Val>Madrid</Val>
</p>
</pairs>
'
SELECT
T.c.value('(Name)[1]','nvarchar(100)') AS Country
,T.c.value('(Val)[1]','nvarchar(100)') AS Capital
FROM
@MyXML.nodes('/pairs/p') T(c)
declare @param nvarchar(100) = 'England'
SELECT
T.c.value('(Val)[1]','nvarchar(100)') AS Capital
FROM
@MyXML.nodes('/pairs/p') T(c)
WHERE T.c.value('(Name)[1]','nvarchar(100)') = @Param