Ошибка привязки элемента XForms

Я изменяю свой код, чтобы использовать привязки в XForms (что лучше, чем повсеместное использование наборов узлов!), но я получаю ошибки.

Сообщение об ошибке, которое я получаю: "Ошибка: XForms Error (8): id (data_criterion) не относится к элементу привязки..."

Из учебников/руководств, которые я использовал, кажется, что это должно работать, но я явно что-то упускаю! (кстати, я моделировал свой код привязки по примерам здесь: http://en.wikibooks.org/wiki/XForms/Bind)

Первоначально я думал, что проблема связана с тем, что я использовал элементы управления xf:select, а не xf:input, как в примерах, но даже после того, как я упростил свой код до самого упрощенного кода, я все равно получаю ошибки!

Это код модели, который я использую:

 <xf:model id="select_data">

     <xf:instance id="criteria_data" xmlns="">
         <file>
             <criteria>
                 <criterion></criterion>
             </criteria>
         </file>
     </xf:instance>

     <bind id="data_criterion" nodeset="instance('criteria_data')/criteria/criterion"/>

</xf:model>

Что касается кода пользовательского интерфейса, это то, что у меня есть:

<xf:input bind="data_criterion">
    <xf:label>Enter criteria:</xf:label>
</xf:input>

Сообщение об ошибке, которое я получаю: "Ошибка: XForms Error (8): id (data_criterion) не относится к элементу привязки..."

У кого-нибудь есть понимание, в чем проблема? Кроме того, есть ли какое-либо особое использование привязок и элементов управления xf: select (с xf: itemset), о которых мне следует знать? (В конечном итоге я использую много элементов управления xf: select в своей форме..)

Заранее спасибо!

ИЗМЕНИТЬ:

Я прогнал код через этот валидатор и получил следующее сообщение (относится к строке привязки): "Предупреждение : Следует ли применять пространство имен XForms к следующему элементу?: bind (строка 66)"


person developer    schedule 03.06.2010    source источник
comment
Я не понимаю, как лучше использовать привязки. Когда у вас нет какого-либо правила проверки для элемента, вам не нужна привязка и меньше писать. Меньше кода — меньше ошибок.   -  person Tambet    schedule 04.06.2010
comment
Как я это вижу, это похоже на использование переменных и менее сложное кодирование. Таким образом, если модель изменится, мне не придется просматривать весь документ, чтобы внести изменения в каждый набор узлов, который должен измениться. Это может вызвать много головной боли и ошибок позже при изменении и поддержке кода. Использование привязок означает только одно изменение для документа, тогда как без них их может быть сто! Верно? Поэтому я считаю, что это лучшая практика. (Кроме того, я где-то это читал ;) лол.   -  person developer    schedule 04.06.2010
comment
согласованный. Я думаю, дело в том, что использование привязок является лучшей практикой, но не всегда верно. Добавление привязки добавляет уровень косвенности, что в некоторых случаях просто означает, что вам нужно писать, читать, поддерживать и понимать больше кода с ограниченными преимуществами.   -  person avernet    schedule 04.06.2010


Ответы (1)


Несколько вещей, которые вы, возможно, захотите изменить:

  1. Не уверен, что это причина ошибки, но выражение nodeset должно быть instance('criteria_data')/criteria/..., без file. Помните: instance() возвращает корневой элемент, а не узел документа. (Об этом вы позаботились, обновив вопрос; хорошо)
  2. Вам не хватает xf на bind. Должно быть: <xf:bind id="data_criterion" nodeset="instance('criteria_data')/criteria/criterion"/>.

См. ниже полный пример с вашим кодом, который отлично работает для меня в Orbeon Forms:

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
      xmlns:xforms="http://www.w3.org/2002/xforms"
      xmlns:xf="http://www.w3.org/2002/xforms"
      xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
      xmlns:ev="http://www.w3.org/2001/xml-events"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:fr="http://orbeon.org/oxf/xml/form-runner">
    <xhtml:head>
        <xhtml:title>SO Bind</xhtml:title>
        <xf:model id="select_data">

            <xf:instance id="criteria_data" xmlns="">
                <file>
                    <criteria>
                        <criterion>Gaga</criterion>
                    </criteria>
                </file>
            </xf:instance>
            <xf:bind id="data_criterion" nodeset="instance('criteria_data')/criteria/criterion"/>
       </xf:model>

    </xhtml:head>
    <xhtml:body>
        <xf:input bind="data_criterion">
            <xf:label>Enter criteria:</xf:label>
        </xf:input>
    </xhtml:body>
</xhtml:html>
person avernet    schedule 04.06.2010
comment
хм... это хороший момент и упущение с моей стороны. Но у меня все еще есть ошибка .. :( Я отредактирую свой код в своем вопросе, чтобы отразить это. Спасибо за ответ! :) - person developer; 04.06.2010
comment
@iHeartGreek, в bind также отсутствует префикс. См. № 2 выше и мой отредактированный ответ. - person avernet; 04.06.2010
comment
МОЙ БОГ. Благодарю. вот и все, что было.. :( Теперь я чувствую себя невероятно глупо. Спасибо за лишние глаза. Теперь я постараюсь быть более осторожным. Я хочу удалить этот вопрос, потому что мне неловко, но я не буду, потому что вы заслуживаете баллов за ответ! :) - person developer; 04.06.2010
comment
@iHeartGreek, я рад, что это помогло. Дополнительные глаза иногда все, что нам нужно. Я знаю, как это :). - person avernet; 09.06.2010