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
элемент.