0

私の問題:

  • 「Sub_Node_Checker」が「false」に設定されている場合にのみ、「Master_Node」の値を選択する必要があります。
  • 「Sub_Node_Checker」が「true」に設定されている場合、値は「Sub_Node」に設定する必要があります。
  • 現在のノードは「Sub_Node」です
  • InfoPath 2010 を使用しています。

これが私のサンプル XML です。

<my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2013-07-02T14:58:05" xml:lang="en-us">
<my:Master_Node>123456</my:Master_Node>
<my:Repeater>
    <my:Sub_Node_Checker>false</my:Sub_Node_Checker>
    <my:Sub_Node></my:Sub_Node>
</my:Repeater>
</my:myFields>

XSN テンプレートをダウンロードするには、次のフォーラム スレッドを参照してください。

これは、私が使用しようとしている XPath ですが、役に立ちません (読みやすくするために改行が追加されています)。

//my:Master_Node[../my:Sub_Node_Checker = "false"] 
|
../my:Sub_Node[../my:Sub_Node_Checker = "true"]

これは何も返さないようです。その理由はわかりません。

次の質問は、XML フォームの「Sub_Node_Checker」に付随します。「サブ ノードはマスター ノードと異なりますか?」

  • ユーザーが「はい」(true) を選択した場合、Sub_Node フィールドは独自の値に設定する必要があります。
  • ユーザーが「いいえ」(false) を選択した場合、Sub_Node フィールドはデフォルトで Master_Node になります。

編集と追加の XML

私のRepeaterセクションは (名前のとおり) 繰り返され、XPath セレクターでさらなる混乱を引き起こしているようです。

<my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2013-07-02T14:58:05" xml:lang="en-us">
<my:Master_Node>123123</my:Master_Node>
<my:Repeater>
    <my:Sub_Node_Checker>false</my:Sub_Node_Checker>
    <my:Sub_Node></my:Sub_Node>
</my:Repeater>
<my:Repeater>
    <my:Sub_Node_Checker>false</my:Sub_Node_Checker>
    <my:Sub_Node></my:Sub_Node>
</my:Repeater>
</my:myFields>
4

3 に答える 3

1

わかりました、これは私の元のアプローチとは少し異なる方法で解決しました。MSDN の次の記事には、関数を使用しsubstring()て外部条件に基づいて異なる値を返す例があります。また、InfoPath Dev の Hilary Stoupa にも、解決策を見つける手助けをしてくれたことに感謝しなければなりません。

また、「現在の」ノードを使用できず、XPath 式を格納し、条件を評価して適切な値を返す 3 番目のノードを作成する必要があったことにも言及します。

以下は、InfoPath が解釈するソース XML の大まかな例です (3 番目のrepeaterグループの xpath 式の "場所" に注意してください - これは、InfoPath が既定値を評価する方法です)。

<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2013-07-02T14:58:05" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us">
<my:Master_Node>123456</my:Master_Node>
<my:Repeater>
    <my:Sub_Node_Checker>true</my:Sub_Node_Checker>
    <my:Sub_Node>9870</my:Sub_Node>
    <my:Sub_Node_Stored>9870</my:Sub_Node_Stored>
</my:Repeater>
<my:Repeater>
    <my:Sub_Node_Checker>false</my:Sub_Node_Checker>
    <my:Sub_Node></my:Sub_Node>
    <my:Sub_Node_Stored>123456</my:Sub_Node_Stored>
</my:Repeater><
my:Repeater>
    <my:Sub_Node_Checker>false</my:Sub_Node_Checker>
    <my:Sub_Node></my:Sub_Node>
    <my:Sub_Node_Stored>concat(substring(../../my:Master_Node, 1, (../my:Sub_Node_Checker != "true") * string-length(../../my:Master_Node)), substring(../my:Sub_Node, 1, (../my:Sub_Node_Checker != "false") * string-length(../my:Sub_Node)))</my:Sub_Node_Stored>
</my:Repeater>
</my:myFields>

次の XPath 式は、適切なノードを選択するのに役立ちました。

concat(substring(../../my:Master_Node, 1, (../my:Sub_Node_Checker != "true") * string-length(../../my:Master_Node)), substring(../my:Sub_Node, 1, (../my:Sub_Node_Checker != "false") * string-length(../my:Sub_Node)))

substring 関数は、ユーザーが指定したターゲット文字列から文字数を返します。サブストリング関数内 (返される文字数に指定された場所) でブール値が評価されると、"1" または "0" のいずれかが返されます。

ターゲット文字列の長さを乗算すると、このブール値チェックにより、特定のターゲット ノードを選択から除外する条件が発生し、そのノードから長さ「0」の文字が返されます。|(0*X=0) これにより、演算子を使用せずに、ノード内でさまざまなデフォルト値を効果的に使用できます。

于 2013-07-03T17:54:16.280 に答える