Работа с саксонским: оценить исключение

У меня есть файл 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. Может из-за этого недоразумения? Спасибо.


person pzeszko    schedule 02.01.2015    source источник
comment
Немного сложно разобраться в таком абстракции. Можете ли вы предоставить минимальный пример, который я мог бы изучить?   -  person ebruchez    schedule 05.01.2015
comment
На самом деле мне удалось решить это самостоятельно, сначала я подумал, что мне нужны дополнительные знания об Орбеоне, чтобы решить эту проблему, но ваш ответ (и некоторые предыдущие) мне помог. Спасибо   -  person pzeszko    schedule 06.01.2015
comment
Рад, что ты это понял!   -  person ebruchez    schedule 06.01.2015


Ответы (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(). Вы хотите, чтобы переменная хранилась:

  1. результат оценки?
  2. или выражение XPath?
person ebruchez    schedule 03.01.2015
comment
Во-первых, извините за неточность - я обновил свой вопрос, ваш код выглядит нормально, но, к сожалению, он не работает, вероятно, из-за этого недоразумения. - person pzeszko; 04.01.2015