0

MSInfoPathに次のXPath1.0式があります(付随するXMLを投稿します)。

//my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modified_Start_Value[(text())] | //my:Start_Value[text() and not(//my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modified_Start_Value[(text()])]

初期値があり、「変更値」がまだない場合は、初期値が返されます。変更された値が存在する場合は、それが返されます。

その値を返し、次の操作を実行する必要があります。

number(//my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modfied_Start_Value) + number(//my:Value_Modifier_Group[0=count(following-sibling::my:Value_Modifier_Group)]//my:Start_Value_Increase) - number(//my:Value_Modifier_Group[0=count(following-sibling::my:Value_Modifier_Group)]//my:Start_Value_Decrease)

この操作は、増加/減少値を加算または減算します。問題は、存在しない場合、この式がNaNを返すことModified_Start_Valueです。それ以外の場合はうまく機能します。

これらの式の両方を1つのXPath式にまとめる必要があります。

  • Modified_Start_Value前の値がある場合は、それを操作で使用します
  • Modified_Start_Value先行する値がない場合は、Start_Value代わりに操作で使用します
  • 前の値は固定されているため、常に「前の」値を使用することが重要です。基準点または開始点として機能します。

これが私が使用しているXMLのサンプルです:

<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.2" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\Chris\Local%20Settings\Application%20Data\Microsoft\InfoPath\Designer3\ef41a19775b4ce0\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.3"?>
<my:myFields xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-09-19T13:28:35" xml:lang="en-us">
<my:Start_Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">6</my:Start_Value>
<my:Main_Group>
    <my:Value_Modifier_Group>
        <my:Modified_Start_Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">6</my:Modified_Start_Value>
        <my:Start_Value_Increase>0</my:Start_Value_Increase>
        <my:Start_Value_Decrease>0</my:Start_Value_Decrease>
    </my:Value_Modifier_Group>
<my:Value_Modifier_Group>
    <my:Modified_Start_Value>6</my:Modified_Start_Value>
    <my:Start_Value_Increase>0</my:Start_Value_Increase>
    <my:Start_Value_Decrease>0</my:Start_Value_Decrease>
</my:Value_Modifier_Group></my:Main_Group>
</my:myFields>

この質問があまりにも急いでまとめられていないことを願っています!今日は忙しい日...

4

1 に答える 1

1

わかりました、私はちょうどそれを理解したので、私はこの質問に自己答えるつもりです。

重要なのは、最初の式の値をノードに配置し、そのノードを2番目の式で参照することにより、XPath式を結合することです。

パイプコマンドのようです| 他の演算子とうまく連携しません。

次の式は、次の方法で値を返します。

  • //my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modified_Start_Value[(text())] | //my:Start_Value[text() and not(//my:Value_Modifier_Group[1=count(following-sibling::my:Value_Modifier_Group)]//my:Modified_Start_Value[(text()])]
  • Modified_Start_Value最初のノードの前に先行するものがない場合Modified_Start_Value、式はデフォルトで初期値になります。
  • このようにして、最新の有効なStart_ValueまたはModified_Start_Value

次に、この式のこの値は、というタイトルのノードに配置されますStartVModStart。次に、このノードのXPathが評価式に入れられます。

../../../my:StartVModStart + number(/descendant-or-self::node()/my:Value_Modifier_Group[0 = count(following-sibling::my:Value_Modifier_Group)]//my:Start_Value_Increase) - number(/descendant-or-self::node()/my:Value_Modifier_Group[0 = count(following-sibling::my:Value_Modifier_Group)]//my:Start_Value_Decrease)

  • この式は「最新の」値を使用してから、変更を加算または減算します

このようにして、最初のノードから開始し、繰り返しノードを通過するまで、ドキュメントの過程で「現在の合計」を維持できます。

この質問は非常に複雑に見えるので、私の質問と回答の両方が明確でないように思われる場合はご容赦ください。より複雑な機能に到達すると、必要なXPath式はますます複雑になります。

于 2012-09-19T18:14:03.273 に答える