У меня есть файл 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 и пропускаю поле 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 (вы помогли мне с этим однажды, Поведение события xforms-model-construct-done), и оно возвращает мне некоторые данные. Теперь я хотел бы заполнить данные для моих входов xf: и приведенный выше код делает это очень хорошо. Проблема в том, что в моем XBL у меня полно параметров, не только arg1
, arg2
, это больше похоже на
<my-xbl arg1 = '' arg2 = '' ... arg19 = '' arg20 = ''/>
Теперь, когда в моей форме я перехожу к основным настройкам управления, я должен заполнить все параметры arg1...20
. Я хотел бы заполнить только те, которые мне нужны, а это обычно 3 или 4, а остальные оставить пустыми. Проблема в том, что я не могу этого сделать, потому что моя форма вылетает из-за того, что saxon:evalute выдает исключение, если ее аргумент равен null.
(Также, чтобы упомянуть все, но я не думаю, что это уместно здесь, но это может помочь вам понять мой код выше: на самом деле arg2
— это идентификатор xf:input
, но arg1
— это что-то вроде пути к ресурсу в веб-сервисе, например, у меня есть arg2 = "'firstname'"
, который относится к моему xf:input и arg1 =" //CUSTOMER/FIRSTNAME"
(без кавычек), а мой URL-адрес службы REST – http://www.thomas-bayer.com/sqlrest/CUSTOMER/2/
. Таким образом, я могу выбрать, что под xf:input идентификатора 'firstname'
я хочу вставить только имя все данные, которые я получил от веб-сервиса. Опять же, arg4 будет как 'lastname'
, а arg3 будет //CUSTOMER/LASTNAME
и т. д. Как я уже сказал, не думаю, что это уместно здесь)
Вот почему я хотел проверить пустое значение, и я думаю, что ваш код должен был мне помочь - к сожалению, он не работает. Моя форма больше не падает, но и данные не заполняются в xf:inputs
. Может из-за этого недоразумения? Спасибо.