XPath:默认为"Master"节点,如果指定,请选择当前节点(在第三个节点中)



我的问题:

  • 只有当"Sub_Node_Checker"设置为"false"时,我才需要选择"Master_Node"中的值
  • 如果"Sub_Node_Checker"设置为"true",则该值必须设置为"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>

一个更干净的解决方案是将谓词移动到<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"]

关于您的xpath问题,您可以尝试这样的方法。

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

如果Master_Node总是在Sub_Node之前(按文档顺序),这应该有效。

好吧,我得到的这个方法与我原来的方法有点不同。MSDN上的以下文章提供了一个使用substring()函数根据外部条件返回不同值的示例。还要感谢InfoPath Dev的Hilary Stoupa帮助我找到了解决方案。

我还将提到,我不能使用"当前"节点,必须创建第三个节点,其中包含我的XPath表达式,并评估返回适当值的条件。

以下是InfoPath可能解释的大致源XML(请注意第三个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)))

子字符串函数返回用户指定的目标字符串中的字符数。当布尔值在子字符串函数内部(在给定的返回字符数的位置)求值时,它会返回"1"或"0"。

当乘以目标字符串的长度时,此布尔检查会导致任何将免除特定目标节点选择的条件从该节点返回长度为"0"个字符。(0*X=0)这有效地允许在节点内使用不同的默认值,而不使用|运算符。

最新更新