Работа с саксоном: оценить исключение
У меня есть файл XBL, где я могу передать некоторые аргументы из моей формы, скажем:
<my-xbl arg1='' arg2=''>
</my-xbl>
<xf:input ref='@arg1'/>
<xf:input ref='@arg2'/>
Тогда у меня есть что-то вроде этого:
<xf:model>
<xf:action id="populate-data-binding">
<xf:action context="instance('sub')"
ev:event="xforms-submit-done"
ev:observer="my-submission">
<xf:action>
<xf:var as="xs:string" name="control-value" value="saxon:evaluate(instance('arg1'))"/>
<xf:var as="xs:string" name="control-name" value="saxon:evaluate(instance('arg2'))"/>
<xf:setvalue ref="xxf:instance('fr-form-instance')//*[name() = $control-name]"
value="$control-value"/>
</xf:action>
</xf:action>
</xf:model>
Проблема в том, когда arg1
пустая строка (это означает, что в моей форме, когда я нажимаю Control settings и Skipp arg1
поле, просто оставив его пустым), то моя форма падает. Когда я вставляю ''
или что-нибудь, кроме пустой строки (asd, q, что-нибудь) как arg1
все отлично. Так что теперь я хотел бы сделать что-то вроде
<xf:var as="xs:string" name=".." value="if(@arg1 ='null') then 'asd'
else 'saxon:evaluate(instance('arg1'))'/>
Это не работает, очевидно, потому что вопрос кавычек (условие должно быть между ''
и я не могу поместить внутри себя какие-либо цитаты) и, возможно, что-то еще. Может ли кто-нибудь помочь мне исправить это? Заранее спасибо.
ОБНОВИТЬ:
Я думаю, я был немного неточным. Чтобы прояснить ситуацию, arg1
это идентификатор xf:input
в моей форме. Когда форма загружается, я вызываю службу REST (вы уже помогли мне в этом, поведение Event xforms-model-construct-done), и она возвращает мне некоторые данные. Теперь я хотел бы заполнить данные для моих входных данных xf: и приведенный выше код делает это очень хорошо. Проблема в том, что в моем XBL у меня много параметров, а не только arg1
, arg2
это больше похоже на
<my-xbl arg1 = '' arg2 = '' ... arg19 = '' arg20 = ''/>
Теперь, когда в моей форме я иду к основным настройкам элемента управления, я должен заполнить все параметры arg1...20
, Я хотел бы заполнить только те, которые мне нужны, обычно 3 или 4, а остальные оставить пустыми. Проблема в том, что я не могу этого сделать, потому что таким образом моя форма падает, и это потому, что saxon:evalute выдает исключение, если его аргумент равен нулю.
(Также упомянуть все, но я не думаю, что это уместно здесь, но это может помочь вам понять мой код выше: на самом деле, arg2
это идентификатор xf:input
но arg1
это что-то вроде пути к ресурсу в веб-сервисе, например, у меня есть arg2 = "'firstname'"
который относится к моему xf:input и arg1 =" //CUSTOMER/FIRSTNAME"
(без кавычек) и мой URL-адрес службы REST http://www.thomas-bayer.com/sqlrest/CUSTOMER/2/
, Таким образом, я могу выбрать это под XF: ввод идентификатора 'firstname'
Я хочу вставить только имя из всех данных, которые я получил от веб-сервиса. Опять же, arg4 будет как 'lastname'
и arg3 будет //CUSTOMER/LASTNAME
и так далее. Как я уже сказал, не думаю, что это актуально здесь)
Вот почему я хотел проверить пустое значение, и я думаю, что ваш код должен был помочь мне - к сожалению, он не работает. Моя форма больше не падает, но и данные не попадают в xf:inputs
, Может потому что это недоразумение? Благодарю.
1 ответ
<xf:var
as="xs:string"
name="..."
value="
if(@arg1 ='null')
then 'asd'
else 'saxon:evaluate(instance(''arg1''))"/>
Чтобы проверить пустую строку, лучше использовать normalize-space()
, Кроме того, я думаю, что instance('arg1')
где значение хранится в обоих случаях:
<xf:var
as="xs:string"
name="..."
value="
if (normalize-space(instance('arg1')) = '')
then 'asd'
else 'saxon:evaluate(instance(''arg1''))'
"/>
Но мне немного непонятно, почему нужно цитировать saxon:evaluate()
вызов. Вы хотите, чтобы переменная содержала:
- результат оценки?
- или выражение XPath?