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)作品。しかし、2番目の条件は機能しません。私は、XPathノードのコンテキストにいくつか問題があると感じています。

結果を得るために2番目の条件をどのように置き換える必要がありますか?

ターゲットXMLは、単純なignoredProperties文書である:

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

=オペレータが一致するすべてのものを返して、複数のノードに対して動作します。 not()とすれば、マッチしたくないと表明することができます。

.../property/text()を明示的に選択する必要はありません。

+0

残念ながら、それは動作しませんでした。結果は以前と同じです。 ignoreプロパティは依然として結果の一部です。 – Crusaderpyro

+0

これは、これが目標としているXMLを投稿します。 – Tomalak

+0

サンプルターゲットXMLを追加しました。しかし、name = 'c_name'は動作し、期待どおりの単一のプロパティを持つ結果を生成するが、not(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>ルート要素を持っている前提としています。

さらに、もう1つの答えですでに示されているように、2番目の条件は間違っています。代わりに書く:

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) 
    ] 
"> 
関連する問題