Динамически оценивать XPath, хранящийся в переменной

У меня есть переменная:

<xf:var name="xpath" value="/my/xpath/expression"/>

и я хочу использовать /my/xpath/expression в атрибуте ref <xf:input>:

<xf:input ref="/my/xpath/expression"/>

Здесь я использую жестко закодированное выражение XPath, но вместо этого я хочу использовать выражение XPath, хранящееся в переменной $xpath, что-то вроде этого:

<xf:input ref="$xpath"/>

Как этого добиться?


person user2539823    schedule 25.04.2014    source источник
comment
<xf:input ref="{$xpath}" />? Или вам нужен строковый литерал? Тогда попробуйте: <xf:var name="xpath" value="'/my/xpath/expression'" />   -  person CodeManX    schedule 25.04.2014
comment
Первое решение не работает: неожиданный токен '{' в выражении xpath. Второе решение, как я упоминал в своем посте, определяет хардкод xpath, но у меня есть xpath в переменной $xpath ($xpath=/my/xpath/expression)   -  person user2539823    schedule 25.04.2014
comment
Или это <xf:variable name="xpath" select="/my/xpath/expression" />? Также взгляните на параметр привязки, возможно, он принимает переменные.   -  person CodeManX    schedule 25.04.2014
comment
@CoDEmanX, спасибо за предложения по этому поводу. Я дал ответ ниже. AVT не поддерживаются для атрибутов XForms, которые уже являются выражениями XPath, такими как ref. Кроме того, поддерживается <xf:variable select="…">, но XForms 2.0 стандартизирует <xf:var value="…">.   -  person ebruchez    schedule 02.05.2014


Ответы (1)


Вероятно, вы имеете в виду, что значение $xpath является строкой, буквальной или нет, которую вы затем хотите оценить. Другое дело сказать:

<xf:var name="xpath" value="/my/xpath/expression"/>

а также:

<xf:var name="xpath" value="'/my/xpath/expression'"/>

В первом случае переменная $xpath содержит выражение XPath, которое вычисляется, когда переменной требуется ее значение. Результатом будет тип XPath, такой как строка, элемент или вообще любая последовательность элементов XPath (item()*). Если ваше выражение действительно говорит /path/to/foo/bar, то результатом будет последовательность из нуля или более узлов элементов с именем bar.

Во втором случае обратите внимание на кавычки '. Это означает, что значение $xpath является строкой.

Если вы хотите, чтобы другая конструкция XForms делала с этой строкой что-то помимо воспроизведения с ней как со строкой, вам придется вычислить это выражение динамически.

Для этого есть функция saxon:evaluate(). Итак, вы можете написать:

<xf:input ref="saxon:evaluate($xpath)"/>

Вы должны убедиться, что префикс пространства имен saxon находится в области действия, с:

xmlns:saxon="http://saxon.sf.net/"

Это еще кое-что, а именно, в каком контексте выполняется выражение. В большинстве случаев должно работать.

person ebruchez    schedule 01.05.2014