我想对节点文本值进行一些比较。 我正面临着一些问题。
案例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']
但是这个查询无效。
我可以知道我错在哪里。
答案 0 :(得分:1)
首先检查父项,然后获取子项的属性:
/StudentDatas[normalize-space(.)='MYSCHOOLDETAILS']/Class_A/@NoofStudents
使用xmllint
进行演示:
$ xmllint input.xml --xpath "/StudentDatas[normalize-space(.)='MYSCHOOLDETAILS']/Class_A/@NoofStudents"
NoofStudents="67"
答案 1 :(得分: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']
顺便说一句,“数据”不是一个正确的英文单词,“数据”已经是复数形式。