输入xml
<?xml version='1.0' encoding='UTF-8'?>
<Report>
<Employee State="A">
<Information>
<Data Name="Rank">SM1</Data>
<Data Name="City">CA</Data>
</Information>
</Employee>
<Employee State="B">
<Information>
<Data Name="Rank">SM2</Data>
<Data Name="City">CA</Data>
</Information>
</Employee>
<Employee State="A">
<Information>
<Data Name="Rank">SM3</Data>
<Data Name="City">CB</Data>
</Information>
</Employee>
<Employee State="D"/>
<Information>
<Data Name="Rank">SM1</Data>
</Information>
</Report>我想要获取Employee节点之前的所有"Employee“节点,这些节点的"State”属性值为"D“,并且其"Name”属性值为"Rank“的"Data”元素值为SM1或SM2
这意味着对于上面的输入,我希望输出如下:
<Employee State="A">
<Information>
<Data Name="Rank">SM1</Data>
<Data Name="City">CA</Data>
</Information>
</Employee>
<Employee State="B">
<Information>
<Data Name="Rank">SM2</Data>
<Data Name="City">CA</Data>
</Information>
</Employee>我使用路径表达式作为
/Report/Employee[@State='D']/preceding-sibling::Employee/Information[Data[@Name='Rank']/text()='SM1' or text()='SM2']我还试着用
/Report/Employee[@State='D']/preceding-sibling::Employee/Information[Data[@Name='Rank']/text()='SM1' or 'SM2']但是看起来语法对属性值是有效的,而不是元素值,语法也不起作用。
发布于 2021-07-03 16:28:11
首先,使用text()来获取元素节点的字符串值是不必要的,也是不好的做法。
其次,你需要告诉我们你使用的是哪个版本的XPath,因为1.0,2.0和3.1都是常用的。
在2.0+中,您可以编写
/Report/Employee[@State='D']/preceding-sibling::Employee
[Information[Data[@Name='Rank']=('SM1','SM2')]]在1.0中,它是
/Report/Employee[@State='D']/preceding-sibling::Employee
[Information[Data[@Name='Rank'][.='SM1' or .='SM2']]]请注意,这将根据请求返回Employee元素,而您的尝试将返回Information元素。
https://stackoverflow.com/questions/68233426
复制相似问题