There are several distinct, key XPath concepts in play here...
Absolute vs relative XPaths (/
vs .
)
/
introduces an absolute location path, starting at the root of the document.
.
introduces a relative location path, starting at the context node.
Named element vs any element (ename
vs *
)
/ename
selects an ename
root element
./ename
selects all ename
child elements of the current node.
/*
selects the root element, regardless of name.
./*
or *
selects all child elements of the context node, regardless of name.
descendant-or-self axis (//*
)
//ename
selects all ename
elements in a document.
.//ename
selects all ename
elements at or beneath the context node.
//*
selects all elements in a document, regardless of name.
.//*
selects all elements, regardless of name, at or beneath the context node.
With these concepts in mind, here are answers to your specific questions...
.//*[@id='Passwd']
means to select all elements at or beneath the
current context node that have an id
attribute value equal to
'Passwd'
.
//child::input[@type='password']
can be simplified to
//input[@type='password']
and means to select all input
elements
in the document that have an type
attribute value equal to 'password'
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…