2012-09-11 43 views
9

我需要創建的XPath表達式執行以下操作:的XPath:默認爲「節點A」,選擇「節點B」,而不是如果「節點B」不是空

  • 返回內部的元件「 NodeA'
  • 返回'NodeB'中的元素(如果它不是空的)。

下面是一些示例XML使我的目標結構可以清楚地看到(我使用MS的InfoPath):

<?xml version="1.0" encoding="UTF-8"?><?mso-infoPathSolution solutionVersion="1.0.0.10" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\Chris\Local%20Settings\Application%20Data\Microsoft\InfoPath\Designer3\9016384cab6148f6\manifest.xsf" ?><?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.3"?> 
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-09-07T14:19:10" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us"> 
<my:NodeASection> 
    <my:NodeA>2012-09-13</my:NodeA> 
</my:NodeASection> 
    <my:NodeBSection> 
     <my:NodeBGroup> 
      <my:NodeB>2012-09-14</my:NodeB> 
     </my:NodeBGroup> 
    </my:NodeBSection> 
</my:myFields> 

此XPath表達式可以用於評估文本是否存在節點B: boolean(//my:NodeB[(text())])

我聽說過「Becker方法」,但我不確定當兩個節點都存在時該如何適用。我是非常新 XPath,並感謝任何可以提供的幫助。如果存在

回答

15

這個XPath表達式返回基站(並具有文本內容)和NodeA上的另一種情況:

//my:NodeB[text()] | //my:NodeA[text() and not(//my:NodeB[text()])] 

如果你想獲得你可以追加選定的節點之後/*所有子元素,這樣

//my:NodeB[text()]/* | //my:NodeA[text() and not(//my:NodeB[text()])]/* 
+0

你是炸彈!我昨天整天都在試圖制定這個問題。我需要爲這個東西上課,我只是將它適應於我稍微複雜的問題。再次感謝! – Shrout1

1

如果是安全的依賴這樣的事實,任何NodeA上的將文檔順序(如所隱含的樣本)節點之前到來,那麼更簡單和更有效的XPath表達式來選擇所需要的元素是......

(//my:NodeA[text()]|//my:NodeB)[1] 

上面選擇元素。如果要選擇元素的文本節點,然後用,而不是...

(//my:NodeA[text()]|//my:NodeB)[1]/text() 

如果nodeA和基站之間(他們可以進來任何的相對順序)沒有位置關係,和你使用XPATH 2.0,則下列表達式將選擇所需文本節點..

(//my:NodeA[text()],//my:NodeB)[1]/text() 
3

正確的XPath表達式是

(//my:NodeB[node()] | //my:NodeA[not(//my:NodeB/node())])/node() 

由於謂詞中的條件是互斥的,所以它們中只有一個可以是true(),這保證了括號中的表達式只能選擇其中一個節點。

因此,上述表達式選擇任何子節點:my:NodeB(如果有子節點)或my:NodeA(otherwize)。

在這裏,我們假設在XML文檔中最多存在一個名爲my:NodeA的元素和至多一個名爲my:NodeB的元素。

另一個假設是綁定了前綴my的名稱空間已使用XPath表達式計算器(您正在使用的特定XPath實現)「註冊」。

請注意所提供的XML文檔中沒有的元素my:NodeAmy:NodeB有任何元素孩子(他們都有一個文本節點孩子) - 所以我認爲用「元素」你實際上意味着「節點」。

+0

Dimitre - 再次感謝!您的迴應似乎更廣泛適用。我是新手,所以如果我錯誤地使用了術語,請原諒我;只是試圖在我去的時候拿起它!我不確切知道MS InfoPath如何用'my'命名空間評估XPath。大衛帕爾森的答案雖然運作良好!我相信[node()]檢查可能會更廣泛適用。 – Shrout1

+0

@Chris,這一切都取決於你的意思是「空」 - 並沒有一個通用的定義。目前接受的答案很可能將「空」解釋爲沒有文本節點的孩子。我的答案將「空」解釋爲沒有任何孩子(所以一個元素具有其他元素作爲子元素,但沒有文本節點子元素被認爲是非空元素。其他人會希望必須至少有一個文本節點子元素如果你嚴格定義了「empty」,那麼人們可以給出更準確的答案 –

+0

在這個例子中,它檢查丟失的文本,InfoPath字段必須綁定到一個XML元素(或節點?),所以總會有一個預先存在的結構。在許多形式中,我有重複的表或節,在這種情況下,可以檢查節點本身的「存在」。 – Shrout1