2016-09-28 8 views
0

iterate과 함께 XForms 작업을 사용하고 있습니다. iterate은 (XPath를 사용하여) 노드 집합을 선택하고 그에 대한 동작을 반복합니다. 문제는 노드 집합을 선택하는 데 여러 조건이 있다는 것입니다.XForms 액션 요소의 반복에서 다른 인스턴스를 참조하는 방법은 무엇입니까?

  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 노드의 컨텍스트에 문제가 있다고 생각합니다.

결과를 얻으려면 두 번째 조건을 어떻게 바꾸어야합니까?

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

답변

0

이 작동합니다 :

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

= 운영자가 일치하는 모든 사람들을 돌아, 여러 노드에 대해 작동

대상 XML

는 간단한 ignoredProperties 문서입니다. not()을 사용하면 일치하는 것을 원하지 않는다고 표현할 수 있습니다.

.../property/text()을 명시 적으로 선택하지 않아도됩니다.

+0

불행하게도 문제가 해결되지 않았다. 결과는 이전과 같습니다. ignore 속성은 여전히 ​​결과의 일부입니다. – Crusaderpyro

+0

대상이되는 XML을 게시하십시오. – Tomalak

+0

샘플 대상 XML을 추가했습니다. 그러나 name = 'c_name'이 작동하고 예상대로 단일 속성을 사용하여 결과를 생성하지만 not (name = 'c_name')는 효과가 없음을 알았습니다 (총 속성 -c_name이 필요합니다). 그 부분이 아닌가요? – Crusaderpyro

0

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) 
    ] 
">