[xml] xmlHasProp() returns attribute declaration for optional attribute s



Hello Daniel, hello @all,

well, as the subject says...
The reference for xmlHasProp() (and xmlHasNsProp()) says that
  "This function also looks in DTD attribute declaration for
  #FIXED or default declaration values unless DTD use has been
  turned off."
and i guess this (and *exactly* this) is the correct and
intended behaviour.
But if an attribute isn't specified at the requested node,
xmlHasProp() (resp. xmlHasNsProp()) does a lookup for a DTD
declaration calling xmlGetDtdAttrDesc() (resp.
xmlGetDtdQAttrDesc()) and therefore returns a non-null
attribute declaration if *any* declaration is found (that is,
also for #IMPLIED declarations w/o default).

If i'm right and this isn't the intended behaviour, i'd
suggest the attached patch that provides the documented
behaviour (it's against v2.5.7):


==============================================================
--- tree_orig.c 2003-06-27 16:54:15.000000000 +0200
+++ tree.c      2003-07-07 14:25:38.000000000 +0200
@@ -5556,11 +5556,13 @@
         xmlAttributePtr attrDecl;
         if (doc->intSubset != NULL) {
             attrDecl = xmlGetDtdAttrDesc(doc->intSubset, node->name, name);
             if ((attrDecl == NULL) && (doc->extSubset != NULL))
         attrDecl = xmlGetDtdAttrDesc(doc->extSubset, node->name, name);
-        if (attrDecl != NULL)
+        if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL))
+           /* return attribute declaration only if a default value is given
+              (that includes #FIXED declarations) */
            return((xmlAttrPtr) attrDecl);
         }
         }
         return(NULL);
 }
@@ -5642,10 +5644,13 @@
         }
         cur++;
         }
         xmlFree(nsList);
         xmlFree(ename);
+        if ((attrDecl != NULL) && (attrDecl->defaultValue != NULL))
+           /* return attribute declaration only if a default value is given
+              (that includes #FIXED declarations) */
            return((xmlAttrPtr) attrDecl);
        }
        }
        return(NULL);
 }
==============================================================


Ciao, Markus


Mit freundlichen Gruessen - Kind regards
Markus Keim



________________________Addressed by:________________________
 ORDAT GmbH & Co. KG  -  Serversystems / eCom 
 Dipl.-Inf. (FH) Markus Keim   Fon: +49 (641) 7941-0
 Rathenaustr. 1                Fax: +49 (641) 7941-132
 35394 Gießen                  mailto:markus_keim ordat com
 See:                          http://www.ordat.com
_____________________________________________________________
I love deadlines. I like the whooshing sound they make as
they fly by.  -- Douglas Adams

Attachment: tree.diff
Description: Binary data



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]