0

我在 MS InfoPath 中有以下 XPath 1.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)

此操作增加或减少增加/减少值。Modified_Start_Value问题是如果不存在,这个表达式返回一个 NaN 。否则效果很好。

我需要将这两个表达式组合成一个 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

好的,我将自己回答这个问题,因为我刚刚弄清楚了。

关键是通过将第一个表达式中的值放入一个节点然后在第二个表达式中引用该节点来组合 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_ValueModified_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 回答