Defines the default parsing behavior for metadata values.
    :param tree_to_parse: the XML tree compatible with element_utils to be parsed
    :param xpath_root: used to determine the relative XPATH location within the parent element
    :param xpath_map: a dict of XPATHs that may contain alternate locations for a property
    :param prop: the property to parse: corresponds to a key in xpath_map

def parse_property(tree_to_parse, xpath_root, xpath_map, prop):
    """
    Defines the default parsing behavior for metadata values.
    :param tree_to_parse: the XML tree compatible with element_utils to be parsed
    :param xpath_root: used to determine the relative XPATH location within the parent element
    :param xpath_map: a dict of XPATHs that may contain alternate locations for a property
    :param prop: the property to parse: corresponds to a key in xpath_map
    """

    xpath = xpath_map[prop]

    if isinstance(xpath, ParserProperty):
        if xpath.xpath is None:
            return xpath.get_prop(prop)

        xpath = xpath.xpath

    if xpath_root:
        xpath = get_xpath_branch(xpath_root, xpath)

    parsed = None

    if not has_property(tree_to_parse, xpath):
        # Element has no text: try next alternate location

        alternate = '_' + prop
        if alternate in xpath_map:
            return parse_property(tree_to_parse, xpath_root, xpath_map, alternate)

    elif '@' not in xpath:
        parsed = get_elements_text(tree_to_parse, xpath)
    else:
        xroot, xattr = get_xpath_tuple(xpath)
        parsed = get_elements_attributes(tree_to_parse, xroot, xattr)

    return get_default_for(prop, parsed)