Как да се препратя към друг екземпляр в итерацията на елемента за действие XForms?

Използвам XForms действие заедно с iterate. iterate избира набор (използвайки XPath) от възли и повтаря действието за него. Проблемът е, че имам множество условия за избор на набор от възли.

  1. Не трябва да има възел readOnly.
  2. Не трябва да е част от списъка ignoreProperties (този списък е в друг екземпляр).

Код:

<xf:action ev:event="setValues" iterate="
    instance('allProps')/props/prop[
        not(readOnly) and
        not(instance('ignoreProperties')/ignoredProperties/property[text() = name]
    ]
">

Първото условие not(readOnly) работи. Но второто условие не работи. Чувствам, че има някакъв проблем с контекста на XPath възлите.

Как трябва да заменя второто условие, за да постигна резултата?

Целевият XML е прост ignoredProperties документ:

<ignoredProperties>
  <property>c_name</property>
  <property>c_tel_no</property>
</ignoredProperties>

person Crusaderpyro    schedule 28.09.2016    source източник


Отговори (2)


Това трябва да работи:

<xf:action ev:event="setValues" iterate="
    instance('allProps')/props/prop[
        not(readOnly) and
        not(name = instance('ignoreProperties')/ignoredProperties/property)
    ]
">

Операторът = работи срещу множество възли, като връща всички, които съвпадат. С not() можете да изразите, че не искате съвпадение.

Няма да е необходимо изрично избиране на .../property/text().

person Tomalak    schedule 28.09.2016
comment
За съжаление това не проработи. Резултатът е същият като преди. Свойствата за игнориране все още са част от резултата. - person Crusaderpyro; 28.09.2016
comment
Публикувайте XML, към който е насочен. - person Tomalak; 28.09.2016
comment
Добавих примерния целеви XML. Разбрах обаче, че name = 'c_name' ще работи и ще произведе резултат с едно свойство, както се очаква, но not(name = 'c_name') няма никакъв ефект (очакваше общи свойства -c_name). Сигурен ли си за нечастта? - person Crusaderpyro; 28.09.2016

Изглежда нещо не е наред с обажданията ви до instance(). Ако имате:

<xf:instance id="ignoredProperties">
    <ignoredProperties>
        <property>c_name</property>
        <property>c_tel_no</property>
    </ignoredProperties>
</xf:instance>

Тогава instance('ignoredProperties') връща елемента <ignoredProperties>. Така че трябва да напишете:

<xf:action ev:event="setValues" iterate="
    instance('allProps')/prop[
        not(readOnly) and
        not(instance('ignoreProperties')/property[text() = name])
    ]
">

Това също предполага, че вашето allProps копие има <props> корен елемент.

Освен това второто условие изглежда грешно, както вече е показано в друг отговор. Напишете вместо това:

not(name = instance('ignoreProperties')/property)

В XPath 2 можете да изясните, че вашите not() тестват съществуването на възел, като използвате empty() вместо това:

<xf:action ev:event="setValues" iterate="
    instance('allProps')/prop[
        empty(readOnly) and
        not(name = instance('ignoreProperties')/property)
    ]
">
person ebruchez    schedule 28.09.2016