2013-07-02 48 views
0

我的問題規定:的XPath:默認爲「主」節點中,選擇當前節點,如果(在第三個節點)

  • 我需要在「Master_Node」選擇值僅在「Sub_Node_Checker」設置到「假」。
  • 如果「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> 

參考the following forum thread下載我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> 

回答

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"] 
+0

Jens,'//my:Master_Node[..//my:Sub_Node_Checker =「false」]'當我有最初發布的確切結構時工作。我已經擴展了我的問題,因爲我可能已經遺漏了一些重要的細節。謝謝你! – Shrout1

+0

是的,你絕對錯過了重要的信息。 :)我仍然不確定謂詞應該是什麼樣子。如何決定是否包含主節點?是否所有節點檢查器都是假的,或者只有其中一個?難道根本沒有?主節點是否也重複? –

+0

如果當前'../ my:Repeater/my:Sub_Node_Checker'等於'false',則將'../ my:Repeater/my:Sub_Node'設置爲'// my:Master_Node'。如果當前的'../ my:Repeater/my:Sub_Node_Checker'等於'true',則將'../ my:Repeater/my:Sub_Node'設置爲'self'。如果安裝了InfoPath,請查看[在此XSN模板文件](http://www.infopathdev.com/forums/storage/41/91044/Conditional_Node_Copy.xsn)。我相信如果你能看看這個模板會更清楚。 – Shrout1

1

與您的XPath的問題,你可以嘗試這樣的事情。

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

這應該工作,如果Master_Node總是Sub_Node之前(按文檔順序)。

+0

謝謝!我希望我可以使用它,但InfoPath不允許定位功能。 – Shrout1

+0

這很奇怪(InfoPath 2003似乎支持[last](http://office.microsoft.com/en-us/infopath-help/functions-in-findath-HP001155281.aspx))。也許你可以用count()替換last()函數再次使用相同的表達式 –

+0

是的 - 不幸的是沒有「位置」或「最後」。這很奇怪,因爲'boolean(..// my:Sub_Node_Checker =「false」)'總是在InfoPath中適當地返回,但'//my:Master_Node[..//my:Sub_Node_Checker =「false」]'似乎總是評估'Sub_Node_Checker'的最後一個現有實例。我的XSN模板附在[以下鏈接](http://www.infopathdev.com/forums/p/26222/91044.aspx#91044) – Shrout1

1

好吧,我得到了這個有點不同於我原來的方法。 The following article on MSDN有一個使用substring()函數根據外部條件返回不同值的示例。還必須感謝InfoPath Dev的Hilary Stoupa的helping me come to the solution

我還會提到我不能使用「當前」節點,並且必須創建第三個節點,它存放了我的XPath表達式並評估條件以返回適當的值。

這裏是源XML大致爲InfoPath中可能會將它(注意第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)在不使用運算符的情況下,這可以有效地在節點內允許不同的默認值。

相關問題