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”:“子节点与主节点不同吗?”

  • 如果用户选择“是”(真),则应将 Sub_Node 字段设置为其自己的值。
  • 如果用户选择“否”(假),则 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 表达式并评估条件以返回适当的值。

这是 InfoPath 可能解释的大致源 XML(注意第 3repeater组中 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 回答
1

一个更简洁的解决方案是将谓词移动到<my:myFields/>元素。

/my:myFields[my:Repeater/my:Sub_Node_Checker = "false"]/my:Master_Node

如果你坚持你的方法,你错过了/跳过<my:Repeater/>元素或引用:

//my:Master_Node[..//my:Sub_Node_Checker = "false"]
//my:Master_Node[../my:Repeater/my:Sub_Node_Checker = "false"]
于 2013-07-02T16:13:32.953 回答
1

关于您的 xpath 问题,您可以尝试这样的事情。

(self::*[../my:Sub_Node_Checker = "true"] 
|
//my:Master_Node)[last()]

Master_Node如果总是在之前Sub_Node(按文档顺序),哪个应该起作用。

于 2013-07-02T16:13:42.047 回答