diff options
author | Fredrik Gustafsson <[email protected]> | 2013-11-05 12:59:37 +0100 |
---|---|---|
committer | Fredrik Gustafsson <[email protected]> | 2013-11-05 12:59:37 +0100 |
commit | 84fd7aa216f0f7f2a1d891b1f0cb1461272dc727 (patch) | |
tree | 5bfde1476c5523f5979667861c7239415df7ed27 /lib/xmerl/src | |
parent | 00a3dade2d58836bca334be36843775343e5e269 (diff) | |
parent | 3702a386fd0121bde1b1d02c65de66245e9518cc (diff) | |
download | otp-84fd7aa216f0f7f2a1d891b1f0cb1461272dc727.tar.gz otp-84fd7aa216f0f7f2a1d891b1f0cb1461272dc727.tar.bz2 otp-84fd7aa216f0f7f2a1d891b1f0cb1461272dc727.zip |
Merge branch 'danielwhite/xmerl-xpath-resolve-context-namespaces/OTP-11461' into maint
* danielwhite/xmerl-xpath-resolve-context-namespaces/OTP-11461:
xmerl: Use context namespace declarations to resolve prefix node tests
xmerl: Look up unknown prefixes in xmlContext when matching attributes
xmerl: Add tests for XPath queries that resolve the context namespace
Diffstat (limited to 'lib/xmerl/src')
-rw-r--r-- | lib/xmerl/src/xmerl_xpath.erl | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/lib/xmerl/src/xmerl_xpath.erl b/lib/xmerl/src/xmerl_xpath.erl index b3301f2faf..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; @@ -760,20 +776,21 @@ node_test({name, {_Tag, Prefix, Local}}, node_test({name, {Tag,_Prefix,_Local}}, #xmlNode{node = #xmlAttribute{name = Tag}}, _Context) -> true; -node_test({name, {_Tag, Prefix, Local}}, - #xmlNode{node = #xmlAttribute{expanded_name = {URI, Local}, - nsinfo = {_Prefix1, _}, - namespace = NS}}, _Context) -> - NSNodes = NS#xmlNamespace.nodes, - case lists:keysearch(Prefix, 1, NSNodes) of - {value, {_, URI}} -> - ?dbg("node_test(~, ~p) -> true.~n", - [{_Tag, Prefix, Local}, write_node(NSNodes)]), - true; - false -> - ?dbg("node_test(~, ~p) -> false.~n", - [{_Tag, Prefix, Local}, write_node(NSNodes)]), - false +node_test({name, {Tag, Prefix, Local}}, + #xmlNode{node = #xmlAttribute{name = Name, + expanded_name = EExpName + }}, Context) -> + case expanded_name(Prefix, Local, Context) of + [] -> + Res = (Tag == Name), + ?dbg("node_test(~p, ~p) -> ~p.~n", + [{Tag, Prefix, Local}, write_node(Name), Res]), + Res; + ExpName -> + Res = (ExpName == EExpName), + ?dbg("node_test(~p, ~p) -> ~p.~n", + [{Tag, Prefix, Local}, write_node(Name), Res]), + Res end; node_test({name, {_Tag, [], Local}}, #xmlNode{node = #xmlNsNode{prefix = Local}}, _Context) -> |