diff options
author | Daniel White <[email protected]> | 2013-09-13 00:22:47 +1000 |
---|---|---|
committer | Fredrik Gustafsson <[email protected]> | 2013-11-04 16:02:21 +0100 |
commit | 3702a386fd0121bde1b1d02c65de66245e9518cc (patch) | |
tree | d0c0daad55afb390ea4fded317a30a28b80b76ac /lib/xmerl | |
parent | f041ece67a75593c39d36c3ef968556214e2b126 (diff) | |
download | otp-3702a386fd0121bde1b1d02c65de66245e9518cc.tar.gz otp-3702a386fd0121bde1b1d02c65de66245e9518cc.tar.bz2 otp-3702a386fd0121bde1b1d02c65de66245e9518cc.zip |
xmerl: Use context namespace declarations to resolve prefix node tests
Previously, a match would not be found if the namespace prefix in the
XPath query was not contained in the original document. This allows
the `namespace' option to provide a prefix that will be resolved to a
namespace URI.
See Section 2.3 of the XPath 1.0 specification for the behaviour of
'NCName:*' node tests.
Diffstat (limited to 'lib/xmerl')
-rw-r--r-- | lib/xmerl/src/xmerl_xpath.erl | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/xmerl/src/xmerl_xpath.erl b/lib/xmerl/src/xmerl_xpath.erl index 9af632e9ac..be0e863ce4 100644 --- a/lib/xmerl/src/xmerl_xpath.erl +++ b/lib/xmerl/src/xmerl_xpath.erl @@ -713,10 +713,26 @@ node_test(_Test, node_test({wildcard, _}, #xmlNode{type=ElAt}, _Context) when ElAt==element; ElAt==attribute; ElAt==namespace -> true; -node_test({prefix_test, Prefix}, #xmlNode{node = N}, _Context) -> +node_test({prefix_test, Prefix}, #xmlNode{node = N}, Context) -> case N of - #xmlElement{nsinfo = {Prefix, _}} -> true; - #xmlAttribute{nsinfo = {Prefix, _}} -> true; + #xmlElement{nsinfo = {Prefix, _}} -> + true; + #xmlElement{expanded_name = {Uri, _}} -> + case expanded_name(Prefix, "_", Context) of + {Uri, _} -> + true; + _ -> + false + end; + #xmlAttribute{nsinfo = {Prefix, _}} -> + true; + #xmlAttribute{expanded_name = {Uri, _}} -> + case expanded_name(Prefix, "_", Context) of + {Uri, _} -> + true; + _ -> + false + end; _ -> false end; |