Function: rng-locate-schema-file-using
rng-locate-schema-file-using is a byte-compiled function defined in
rng-loc.el.gz.
Signature
(rng-locate-schema-file-using FILES)
Documentation
Locate a schema using the schema locating files FILES.
FILES is a list of file-names. Return either a URI, a list (TYPE-ID) where TYPE-ID is a string, or nil.
Source Code
;; Defined in /usr/src/emacs/lisp/nxml/rng-loc.el.gz
(defun rng-locate-schema-file-using (files)
"Locate a schema using the schema locating files FILES.
FILES is a list of file-names.
Return either a URI, a list (TYPE-ID) where TYPE-ID is a string,
or nil."
(let (rules
;; List of types that override normal order-based
;; priority, most important first
preferred-types
;; Best result found so far; same form as return value.
best-so-far)
(while (and (progn
(while (and (not rules) files)
(setq rules (rng-get-parsed-schema-locating-file
(car files)))
(setq files (cdr files)))
rules)
(or (not best-so-far) preferred-types))
(let* ((rule (car rules))
(rule-type (car rule))
(rule-matcher (get rule-type 'rng-rule-matcher)))
(setq rules (cdr rules))
(cond (rule-matcher
(when (and (or (not best-so-far)
(memq rule-type preferred-types)))
(setq best-so-far
(funcall rule-matcher (cdr rule)))
preferred-types)
(setq preferred-types
(nbutlast preferred-types
(length (memq rule-type preferred-types)))))
((eq rule-type 'applyFollowingRules)
(when (not best-so-far)
(let ((prefer (cdr (assq 'ruleType (cdr rule)))))
(when (and prefer
(not (memq (setq prefer (intern prefer))
preferred-types)))
(setq preferred-types
(nconc preferred-types (list prefer)))))))
((eq rule-type 'include)
(let ((uri (cdr (assq 'rules (cdr rule)))))
(when uri
(setq rules
(append (rng-get-parsed-schema-locating-file
(rng-uri-file-name uri))
rules))))))))
best-so-far))