Как выбрать элемент по переменной в xquery?

Я знаю, как выбрать такой элемент:

$table/foo

Однако как мне это сделать, если имя элемента хранится как переменная. Например:

let $x = "foo"
$table/[$x]

Я знаю, как это сделать, если это свойство из: Как выбрать атрибут по переменной в xquery?


person Yahya Uddin    schedule 01.12.2015    source источник


Ответы (2)


Это почти идентично ответу на вопрос ">Как выбрать атрибут по переменной в xquery? но вместо использования селектора атрибута @* вы должны использовать селектор элемента * (или element()):

$table/*[local-name() = 'foo']

$table/element()[local-name() = 'foo']
person wst    schedule 01.12.2015
comment
что, скорее всего, будет более эффективным * или element() - person Yahya Uddin; 01.12.2015
comment
@YahyaUddin Они эквивалентны. Вы можете думать о * как о макросе для element(). - person wst; 01.12.2015
comment
Будет ли это работать, если имя элемента будет более сложным, например, foo/bar/hat? - person Yahya Uddin; 01.12.2015
comment
@YahyaUddin Да, в любом случае это просто оценка выражений и подвыражений. Подобно выражению со звездочкой, foo/bar является сокращением для element(foo)/child::element(bar). Вы можете продолжать ходить по дереву бесконечно, пока ваши выражения верны. - person wst; 01.12.2015

Будет ли это работать, если имя элемента будет более сложным, например «foo/bar/hat»?

Нет, предикат [name() = 'foo/bar/hat'] ничего не выберет, потому что foo/bar/hat — это выражение пути, а не имя элемента. Переменные в XPath содержат значения, а не выражения или фрагменты выражений - это не похоже на сценарий оболочки (или другой макроязык), где переменные раскрываются, а расширенное выражение затем повторно анализируется.

XQuery не имеет какой-либо общей возможности для динамического построения выражения в виде строки и последующего его вычисления. Многие продукты имеют для этого функции расширения, часто называемые xx:eval() или xx:evaluate(). В XSLT 3.0 есть инструкция xsl:evaluate.

person Michael Kay    schedule 02.12.2015
comment
Я откатил правки. Такая типографика может хорошо смотреться в Ченнаи, но это не мой стиль, и я оставляю за собой право писать в своем собственном стиле без того, чтобы какой-нибудь редактор копировал его под себя. - person Michael Kay; 07.07.2016