aboutsummaryrefslogtreecommitdiff
path: root/xsd/cxx/elements.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2009-12-03 17:02:56 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2009-12-03 17:02:56 +0200
commitd71611d5fb575078bdf573c35257bb86bb7054e0 (patch)
tree9702bfd0a370ececb7a6b57dcee0913938080f7a /xsd/cxx/elements.cxx
parent5212455789c8600ac830afbd3e8c55c76b2104ed (diff)
Implement automatic mapping for urn-style XML namespaces
Diffstat (limited to 'xsd/cxx/elements.cxx')
-rw-r--r--xsd/cxx/elements.cxx27
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 ());
}
}
}