diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2009-12-03 17:02:56 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2009-12-03 17:02:56 +0200 |
commit | d71611d5fb575078bdf573c35257bb86bb7054e0 (patch) | |
tree | 9702bfd0a370ececb7a6b57dcee0913938080f7a /xsd/cxx/elements.cxx | |
parent | 5212455789c8600ac830afbd3e8c55c76b2104ed (diff) |
Implement automatic mapping for urn-style XML namespaces
Diffstat (limited to 'xsd/cxx/elements.cxx')
-rw-r--r-- | xsd/cxx/elements.cxx | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/xsd/cxx/elements.cxx b/xsd/cxx/elements.cxx index 3cd5e9e..fd23fc0 100644 --- a/xsd/cxx/elements.cxx +++ b/xsd/cxx/elements.cxx @@ -144,6 +144,8 @@ namespace CXX cxx_id_expr_ (L"^(::)?([a-zA-Z_]\\w*)(::[a-zA-Z_]\\w*)*$"), cxx_id_expr (cxx_id_expr_), trace_namespace_regex (trace_namespace_regex_), + urn_mapping_ (L"#^urn.*:([a-zA-Z_].*)$#$1#"), + urn_mapping (urn_mapping_), nsr_mapping (nsr_mapping_), nsm_mapping (nsm_mapping_), include_mapping (include_mapping_), @@ -352,22 +354,37 @@ namespace CXX if (!found) { + String const& n (ns.name ()); + // Check if the name is valid by itself. // - if (ns.name ().empty ()) + if (n.empty ()) { // Empty name denotes a no-namespace case. // - tmp = ns.name (); + tmp = n; } else { - tmp = colon.merge (ns.name ()); // replace `/' with `::' + tmp = colon.merge (n); // replace `/' with `::' if (!cxx_id_expr.match (tmp)) { - throw NoNamespaceMapping ( - ns.file (), ns.line (), ns.column (), ns.name ()); + // See if this is a urn-style namespace. + // + if (urn_mapping.match (n)) + { + Regex filter (L"#[.:-]#_#"); + tmp = urn_mapping.merge (n); + tmp = filter.merge (tmp); + + if (!cxx_id_expr.match (tmp)) + throw NoNamespaceMapping ( + ns.file (), ns.line (), ns.column (), ns.name ()); + } + else + throw NoNamespaceMapping ( + ns.file (), ns.line (), ns.column (), ns.name ()); } } } |