2015-04-01 53 views
1

我想對節點文本值做一些比較。 我正面臨着一些問題。比較根節點文本XPATH

案例1:

<XmlData> 
    <StudentDatas NoofStudents="67">MYSCHOOL</StudentDatas> 
</XmlData> 

/XmlData/StudentDatas/text()[.=normalize-space('MYSCHOOL')] - 這是工作。

但下列情況下,不工作: -

<StudentDatas>MYSCHOOLDETAILS 
    <Class_A NoofStudents="67" Class_Teacher="DhanPal"> 
     <StudentData Category="HighClass"> 
      <Student Id="1010" Name="N1" BloodGroup="A+" /> 
      <Student Id="1011" Name="N2" BloodGroup="B+" /> 
      <Student Id="1012" Name="N3" BloodGroup="C+" />    
     </StudentData>   
    </Class_A>  
</StudentDatas> 

在這裏,我要選擇的noofstudent屬性,當根節點文本與給定的文本匹配:

/StudentDatas/Class_A/@NoofStudents[../text()='MYSCHOOLDETAILS'] 

但這查詢不起作用。

我可以很好地知道我在哪裏,我錯了。

回答

1

首先檢查父,然後得到孩子的屬性:

/StudentDatas[normalize-space(.)='MYSCHOOLDETAILS']/Class_A/@NoofStudents 

演示使用xmllint

$ xmllint input.xml --xpath "/StudentDatas[normalize-space(.)='MYSCHOOLDETAILS']/Class_A/@NoofStudents" 
NoofStudents="67" 
1

alecxe已經給出很好的答案,我只是增加一個解釋,爲什麼你原來的表情不起作用。

你的XPath表達式:

/StudentDatas/Class_A/@NoofStudents[../text()='MYSCHOOLDETAILS'] 

裝置

選擇的最外元件StudentDatas,選擇其所謂Class_A子元素,並選擇其屬性NoofStudents。但是,只有這些屬性的父項至少有一個直接的子文本節點等於「MYSCHOOLDETAILS」。

但是,正如你所看到的,@NoofStudents父爲Class_A - 它沒有這個文本節點。 StudentDatas是該屬性的祖父。此外,它包含的文本節點不等於MYSCHOOLDETAILS,其中也有空格。

下面的路徑表達式會工作(當然,alecxe的解決方案是更好的方式來做到這一點)

/StudentDatas/Class_A/@NoofStudents[normalize-space(../../text())='MYSCHOOLDETAILS'] 

順便說一句,「DATAS」不是一個適當的英文單詞,「數據「已經是一個複數形式。

+0

感謝您增加添加的原因,爲什麼「../」和感謝突出顯示「數據」... – NANDAKUMAR 2015-04-01 16:22:33