diff options
author | Jan Pokorný <jpokorny@redhat.com> | 2014-06-13 20:00:40 +0200 |
---|---|---|
committer | Jan Pokorný <jpokorny@redhat.com> | 2014-06-13 20:07:39 +0200 |
commit | 987a0d4af3bb0e3352748fcd14b3f1172490f560 (patch) | |
tree | 5c403e202eed74796f4c5a80d9d950a219eb83f8 /utils_xml.py | |
parent | f6046694c11a61ed0e678ca7f8b8d32eaf24ada3 (diff) | |
download | clufter-987a0d4af3bb0e3352748fcd14b3f1172490f560.tar.gz clufter-987a0d4af3bb0e3352748fcd14b3f1172490f560.tar.xz clufter-987a0d4af3bb0e3352748fcd14b3f1172490f560.zip |
utils_xml: define and use new XML/lxml.etree helpers
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
Diffstat (limited to 'utils_xml.py')
-rw-r--r-- | utils_xml.py | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/utils_xml.py b/utils_xml.py index 6170a2e..756ee7d 100644 --- a/utils_xml.py +++ b/utils_xml.py @@ -36,16 +36,34 @@ def squote(s): return "'" + s + "'" +def namespaced(ns, ident): + """Return `ident` in Clark's notation denoting `ns` namespace""" + ret = "{{{0}}}{1}".format(NAMESPACES.get(ns, ns), ident) + return ret + + +def nselem(ns, tag, **kwargs): + return etree.Element(namespaced(ns, tag), **kwargs) + +rng_get_start = etree.ETXPath("/{0}/{1}" + .format(namespaced('rng', 'grammar'), + namespaced('rng', 'start'))) + +RNG_ELEMENT = ("/{0}//{1}".format(namespaced('rng', 'grammar'), + namespaced('rng', 'element')) + .replace('{', '{{').replace('}', '}}') + + "[@name = '{0}']") + + @selfaware def rng_pivot(me, et, tag): """Given Relax NG grammar etree as `et`, change start tag (in situ!)""" - start = et.xpath("/rng:grammar/rng:start", namespaces=NAMESPACES) + start = rng_get_start(et) if len(start) != 1: raise UtilsXmlError("Cannot change start if grammar's `start' is" " not contained exactly once ({0} times)" .format(len(start))) - target = et.xpath("//rng:element[@name = '{0}']".format(tag), - namespaces=NAMESPACES) + target = etree.ETXPath(RNG_ELEMENT.format(tag))(et) if len(target) != 1: raise UtilsXmlError("Cannot change start if the start element `{0}'" " is not contained exactly once ({1} times)" @@ -56,16 +74,16 @@ def rng_pivot(me, et, tag): label = me.__name__ + '_' + tag # target's content place directly under /grammar wrapped with new define... - new_define = etree.Element('define', name=label) + new_define = nselem('rng', 'define', name=label) new_define.append(target) parent_start.append(new_define) # ... while the original occurrence substituted in-situ with the reference - new_ref = etree.Element('ref', name=label) + new_ref = nselem('rng', 'ref', name=label) parent_target.insert(index_target, new_ref) # ... and finally /grammar/start pointed anew to refer to the new label - start_ref = deepcopy(new_ref) + start_ref = nselem('rng', 'ref', name=label) start.clear() start.append(start_ref) |