XPath: How to select elements based on their value?
I am new to using XPath and this may be a basic question. Kindly bear with me and help me in resolving the issue. I have an XML file like this:
<RootNode>
<FirstChild>
<Element attribute1="abc" attribute2="xyz">Data</Element>
<FirstChild>
</RootNode>
I can validate the presence of an <Element>
tag with:
//Element[@attribute1="abc" and @attribute2="xyz"]
Now I also want to check the value of the tag for string "Data"
. For achieving this I was told to use:
//Element[@attribute1="abc" and @attribute2="xyz" and Data]
When I use the later expression I get the following error:
Assertion failure message: No Nodes Matched //Element[@attribute1="abc" and @attribute2="xyz" and Data]
Kindly provide me with your advice whether the XPath expression I have used is valid. If not what will be the valid XPath expression?
The condition below:
//Element[@attribute1="abc" and @attribute2="xyz" and Data]
checks for the existence of the element Data within Element and not for element value Data.
Instead you can use
//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]
The reason why I add this answer is that I want to explain the relationship of .
and text()
.
The first thing is when using []
, there are only two types of data:
*[number]
to select a node from node-set *[bool]
to filter a node-set from node-set In this case, the value is evaluated to boolean by function boolean()
, and there is a rule:
Filters are always evaluated with respect to a context.
When you need to compare text()
or .
with a string "Data"
, it first uses string()
function to transform those to string type, than gets a boolean result.
There are two important rule about string()
:
The string()
function converts a node-set to a string by returning the string value of the first node in the node-set, which in some instances may yield unexpected results.
text()
is relative path that return a node-set contains all the text node of current node(context node), like ["Data"]
. When it is evaluated by string(["Data"])
, it will return the first node of node-set, so you get "Data" only when there is only one text node in the node-set.
If you want the string()
function to concatenate all child text, you must then pass a single node instead of a node-set.
For example, we get a node-set ['a', 'b']
, you can pass there parent node to string(parent)
, this will return 'ab'
, and of cause string(.)
in you case will return an concatenated string "Data"
.
Both way will get same result only when there is a text node.
链接地址: http://www.djcxy.com/p/78162.html上一篇: 通过XPath提取属性节点的值
下一篇: XPath:如何根据它们的值选择元素?