Ищите значение дочернего элемента вместо позиции:
date_1 PATH 'other-dates/other-date[date-type="DATE_1"]/date-value',
date_2 PATH 'other-dates/other-date[date-type="DATE_2"]/date-value'
С вашими модифицированными примерами:
SELECT *
FROM XMLTABLE('//contract-dates'
PASSING xmltype('
<contract-dates>
<other-dates>
<other-date>
<date-type>DATE_1</date-type>
<date-value>2020-01-01</date-value>
</other-date>
<other-date>
<date-type>DATE_2</date-type>
<date-value>2020-03-30</date-value>
</other-date>
</other-dates>
</contract-dates>')
COLUMNS
date_1 PATH 'other-dates/other-date[date-type="DATE_1"]/date-value',
date_2 PATH 'other-dates/other-date[date-type="DATE_2"]/date-value'
);
DATE_1 DATE_2
------------------------------ ------------------------------
2020-01-01 2020-03-30
и
SELECT *
FROM XMLTABLE('//contract-dates'
PASSING xmltype('
<contract-dates>
<other-dates>
<other-date>
<date-type>DATE_2</date-type>
<date-value>2020-03-30</date-value>
</other-date>
</other-dates>
</contract-dates>')
COLUMNS
date_1 PATH 'other-dates/other-date[date-type="DATE_1"]/date-value',
date_2 PATH 'other-dates/other-date[date-type="DATE_2"]/date-value'
);
DATE_1 DATE_2
------------------------------ ------------------------------
2020-03-30
Кстати вы можете указать тип данных столбцов результата, что может облегчить работу с ними; поскольку значения представлены в формате сенсибеля, вы можете объявить их непосредственно в виде дат здесь:
date_1 date PATH 'other-dates/other-date[date-type="DATE_1"]/date-value',
date_2 date PATH 'other-dates/other-date[date-type="DATE_2"]/date-value'