xQuery, как использовать переменные в выражении пути

У меня есть документ XML:

<resultsets>
    <row>
        <emp_no>10001</emp_no>
        <first_name>Georgi</first_name>
        <last_name>Facello</last_name>
    </row>
    <row>
        <emp_no>10007</emp_no>
        <first_name>Bezalel</first_name>
        <last_name>Simmel</last_name>
    </row>
</resoutsets>

У меня есть один переменный запрос emp_no поле определяется как:

let $emp_no := doc("employees.xml")//emp_no

Я хочу использовать имя узла $emp_no (emp_no) в своем запросе, чтобы сделать то же самое, что-то вроде:

doc("employees.xml")//$emp_no/name()

Можно ли включить переменную в путь в левой части выражения?

2 ответа

Можно ли включить переменную в путь в левой части выражения?

Ключевым моментом здесь является то, что замена имени в пути ссылкой на переменную является синтаксически допустимой, но это не означает, что вы, вероятно, думаете, что это означает. Если переменная $X имеет значение "orders", то

//customer/$X

не значит

//customer/orders

Вместо этого это означает

//customer/"orders"

который возвращает одно вхождение строки "orders" для каждого элемента customer в документе.

Если вы хотите найти элементы, имя которых равно строке $X, используйте

//customer/*[name()=$X]

если не задействованы пространства имен, в этом случае вам нужно сравнить URI пространства имен и локальное имя.

Да, вы можете использовать переменные в выражении XPath. Но не ясно, что вы просите или пытаетесь достичь.

Если вы ищете, чтобы выбрать элементы, которые имеют одинаковые name() как те, которые назначены элементам, назначенным на $emp_no переменной, вы можете сопоставить любой элемент, а затем использовать фильтр предикатов, чтобы проверить, является ли name() равно любому из name() Значения из последовательности элементов в $emp_no:

doc("employees.xml")//*[name() = $emp_no/name()]

Тем не менее, это просто вернет то же самое emp_no элементы, которые уже были назначены $emp_no элемент.

Другие вопросы по тегам