2012-08-23 77 views
1

我需要一個XPath表達式來驗證XML列表元素是否只有某種類型的節點。 例如:XPath - 確定樹是否只有一種類型的「葉」節點

我需要知道列表是否只有圖像。

<?xml version="1.0" encoding="UTF-8"?> 

<mc type="group"> 
    <mc type="list"> 
    <mc type="group"> 
     <mc type="image"/> 
    </mc> 
    <mc type="group"> 
     <mc type="image"/> 
    </mc> 
    <mc type="group"> 
     <mc type="image"/> 
    </mc> 
    <mc type="group"> 
     <mc type="image"/> 
    </mc> 
    </mc> 
</mc> 

上面的XML是TRUE

<?xml version="1.0" encoding="UTF-8"?> 

<mc type="group"> 
    <mc type="list"> 
    <mc type="group"> 
     <mc type="image"/> 
    </mc> 
    <mc type="group"> 
     <mc type="image"/> 
     <mc type="text"/> 
    </mc> 
    <mc type="group"> 
     <mc type="image"/> 
    </mc> 
    <mc type="group"> 
     <mc type="image"/> 
    </mc> 
    </mc> 
</mc> 

上面的XML是FALSE

回答

2

使用

not(//mc[not(mc) and @type[not(. = 'image')]]) 

這個計算結果爲true()如果並且僅在沒有「葉」mc元素的情況下,其type屬性的字符串值與字符串"image"不同。

說明:正確使用的 「double-negation law」。

1

您可以檢查not(/mc/mc[@type = 'list']//mc[not(@type = 'image')])如果你,如果你開始的開始與文檔節點作爲上下文節點或not(.//mc[not(@type = 'image')])mc元素與type="list"屬性。

+1

不應該不是(/ mc/mc [@type ='list'] // mc [not(@type ='image')])? – oriharel

+1

是的,你是對的,它應該分別在第二個表達式的謂詞的第一個路徑的第二個謂詞中成爲'image'而不是'list'。我將編輯。 –

0

你可以使用一個或多個否定:not(one-or-more(mc[not(@type = 'image')]))或其他一些。

0

或者愚蠢/簡單的方法,檢查所有MC的元素,如果他們不是圖像/組/列表:

not(//mc[not(@type = ("image", "group", "list"))]) 
相關問題