anchor.diff:  ;;; - asset/unit
   ;;; - asset/up_axis
   
  +;;;;;;;;;;;;;;;;;;;
  +;;; DOM-HELPERS ;;;
  +;;;;;;;;;;;;;;;;;;;
  +
  +(defun dom-select-if (node function &key direct)
  +  (labels ((collect (node)
  +             (loop for child across (dom:child-nodes node)
  +                when (funcall function child)
  +                collect child))
  +           (rec (node)
  +             (nconc (loop for child across (dom:child-nodes node)
  +                       when (dom:element-p child)
  +                       nconc (rec child))
  +                    (collect node))))
  +    (if direct
  +        (collect node)
  +        (rec node))))
  +
  +
  +(defun dom-singleton (result singleton)
  +  (if singleton
  +      (progn
  +        (assert (= 1 (length result)))
  +        (elt result 0))
  +      result))
  +
  +
  +(defun dom-select-tag (node tag-name
  +                       &key
  +                         direct
  +                         singleton)
  +  (let ((result (dom-select-if node
  +                               (lambda (node)
  +                                 (and (dom:element-p node)
  +                                      (string= tag-name (dom:tag-name node))))
  +                               :direct direct)))
  +    (dom-singleton result singleton)))
  +
  +(defun dom-select-path (node path &key singleton)
  +  (labels ((rec (nodes path)
  +             (if path
  +                 (rec (loop for n in nodes
  +                         nconc (dom-select-if n (lambda (node)
  +                                                  (and (dom:element-p node)
  +                                                       (string= (car path) (dom:tag-name node))))
  +                                              :direct t))
  +                      (cdr path))
  +                 nodes)))
  +    (let ((result (rec (list node) path)))
  +      (dom-singleton result singleton))))
   
   
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
positive.code: 
  (defun collada-parse-effect (dom node)
    (assert (string= (dom:tag-name node) "effect"))
    (let* ((profile (collada-node-singleton node "profile_COMMON"))
           (technique (collada-node-singleton profile "technique"))
           (phong (collada-node-singleton technique "phong"))
           (result (make-collada-effect)))
      (labels ((color-value (node)
                 (collada-parse-color dom (collada-node-singleton node "color")))
               (float-value (node)
                 (collada-parse-float dom (collada-node-singleton node "float"))))
        (loop for child across (dom:child-nodes phong)
           when (dom:element-p child)
           do
  
negative.code: (defun collada-parse-source (dom node)
    (declare (ignore dom))
    (assert (string= (dom:tag-name node) "source"))
    (let* ((array-node (dom-select-tag node "float_array" :direct t :singleton t))
           (array-values (collada-node-floats array-node))
           (technique-node (dom-select-tag node "technique_common" :direct t :singleton t))
           (accessor-node (dom-select-tag technique-node "accessor" :direct t :singleton t))
           (stride (if (dom:has-attribute accessor-node "stride")
                       (parse-integer (dom:get-attribute accessor-node "stride"))
                       1)))
  