2015-12-16 38 views
2
My XML: 
    <tests> 
    <test name="Machine1" enabled="true"> 
    <action enabled="true" Result="true">T_1</action> 
    <action enabled="true" Result="false">T_2</action> 
    <action enabled="true" Result="true">T_3</action> 
    <action enabled="true" Result="none">T_4</action> 
    </test> 
    <test name="Machine2" enabled="false"> 
    <action enabled="true" Result="true">T_5</action> 
    <action enabled="true" Result="false">T_6</action> 
    <action enabled="true" Result="false">T_7</action> 
    <action enabled="true" Result="true">T_8</action> 
    </test> 
    </tests> 

我想從屬性[@ enabled ='true']的「test」節點中選擇具有屬性[@ Result ='true']的子節點。 即理想情況下,應該給兩個節點:如何使用JScript中的XML查詢使用父節點對象來選擇具有特定屬性值的特定子節點?

<action enabled="true" Result="true">T_1</action> 
<action enabled="true" Result="true">T_3</action> 

相反,我得到的所有節點從整個XML具有屬性[@結果=「真」。即:

<action enabled="true" Result="true">T_1</action> 
<action enabled="true" Result="true">T_3</action> 
<action enabled="true" Result="true">T_5</action> 
<action enabled="true" Result="true">T_8</action> 

我的代碼:

var filepath = "C:\\Test.xml" 
var oXML = Runner.CallMethod("XMLLib.LoadDOM", filepath); 
var testNodes = oXML.SelectNodes("//test"); 
for (var i=0; i<testNodes.length; i++) 
    { 
    var test = testNodes.nextNode; 
    if (test.getAttribute("enabled") == "true") 
     { 
     var pass = test.SelectNodes("//action[@Result='true']").length; 
     var fail = test.SelectNodes("//action[@Result='false']").length; 
     var missing = test.SelectNodes("//action[@Result='none']").length; 
     } 
    } 

請幫我解決或任何其他方式來獲得期望的結果...謝謝!

回答

0

嘗試執行以///開頭的相對XPath時,這是常見的錯誤。你需要把在的XPath的開頭一個點(.),使其相對於當前上下文元素,這是由可變test引用的元素:

var pass = test.SelectNodes(".//action[@Result='true']").length; 

爲了讓你可以使用./child::action直接子元素相反,或者簡單地說./action甚至只是action。更簡單的形式是可能的,因爲child::是XPath中的默認軸。它會選擇使用,當你不明確提及任何其他軸:

var pass = test.SelectNodes("action[@Result='true']").length; 
+0

我試過使用var pass = test.SelectNodes(「./ child :: action [@ Result ='true']」)。length;和var pass = test.SelectNodes(「.// action [@ Result ='true']」)。length; 'pass = 0' – Astral

+0

因此看起來是「。」不管用。或者我在語法中缺少某些東西? – Astral

+0

@Astral實際上'action'的屬性名稱是什麼,'ATPResult'或者只是'Result'? – har07

0

相反,我試圖modyfying查詢爲:

var name = test.getAttribute("name"); 
var testNode = "//test[@name=" + "'" + name + "'"; 
var pass = test.SelectNodes(testNode + "]/action[@Result='true']").length; 

和我得到所需的輸出。 這是正確/有效的方式嗎?

相關問題