Как сделать xforms:insert без необходимости xforms:delete в конце?

<xf:action ev:event="xforms-model-construct">
    <xf:insert nodeset="instance('subInstance')/type" origin="instance('defaultType')/type"/>
</xf:action>

Я хочу заполнить экземпляр на основе другого. Я могу сделать это с помощью xf:insert, как показано выше.

Однако я понял, что экземпляр «subInstance» должен содержать элемент пустого типа перед запуском xf:inserts.

<subInstance>
  <type/>
</subInstance>

Итак, после всех xf:inserts мне нужно сделать следующее, чтобы удалить первый пустой:

<xf:delete nodeset="instance('subInstance')/type" at="1" />

Что-то не так с этим методом или есть способ вставить напрямую без начального пустого?


person Crusaderpyro    schedule 03.10.2016    source источник


Ответы (1)


Два ответа:

Вам действительно не нужен элемент начального типа

Ваш исходный экземпляр может быть просто:

<subInstance/>

Затем вы можете вставить в элемент subInstance с помощью:

<xf:action ev:event="xforms-model-construct">
    <xf:insert
        context="instance('subInstance')"
        origin="instance('defaultType')/type""/>
</xf:action>

Использование context без nodeset или ref означает, что вы хотите вставить в узел, на который указывает context.

Вы по-прежнему можете делать то, что хотите, но с поддержкой XForms 2.0.

Если вы хотите сохранить исходный вложенный элемент type, вы можете написать это:

<xf:action ev:event="xforms-model-construct">
    <xf:insert
        nodeset="instance('subInstance')"
        origin="
            xf:element(
                'subInstance',
                instance('defaultType')/type
            )
        "/>
</xf:action>
  1. При нацеливании на корневой элемент целевого экземпляра будет заменен весь экземпляр. Это уже относится к XForms 1.1.
  2. С использованием атрибута origin функции xf:element() из XForms 2.0 , вы можете динамически создать документ XML с корнем subInstance и содержащий только элементы type из экземпляра defaultType.

Чтобы сделать это еще более современным, вы должны заменить nodeset на ref, поскольку nodeset устарело в XForms 2.0:

<xf:action ev:event="xforms-model-construct">
    <xf:insert
        ref="instance('subInstance')"
        origin="
            xf:element(
                'subInstance',
                instance('defaultType')/type
            )
        "/>
</xf:action>
person ebruchez    schedule 03.10.2016
comment
Спасибо. Первый ответ (контекст) - это то, что я искал. - person Crusaderpyro; 04.10.2016