比较根节点文本XPATH

时间:2015-04-01 02:37:15

标签: xml 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']

但是这个查询无效。

我可以知道我错在哪里。

2 个答案:

答案 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']

顺便说一句,“数据”不是一个正确的英文单词,“数据”已经是复数形式。