Attr interface represents an attribute in an
Element object. Typically the allowable values for the
attribute are defined in a schema associated with the document.
Attr objects inherit the Node interface, but
since they are not actually child nodes of the element they describe, the
DOM does not consider them part of the document tree. Thus, the
Node attributes parentNode,
previousSibling, and nextSibling have a
null value for Attr objects. The DOM takes the
view that attributes are properties of elements rather than having a
separate identity from the elements they are associated with; this should
make it more efficient to implement such features as default attributes
associated with all elements of a given type. Furthermore,
Attr nodes may not be immediate children of a
DocumentFragment. However, they can be associated with
Element nodes contained within a
DocumentFragment. In short, users and implementors of the
DOM need to be aware that Attr nodes have some things in
common with other objects inheriting the Node interface, but
they also are quite distinct.
The attribute's effective value is determined as follows: if this
attribute has been explicitly assigned any value, that value is the
attribute's effective value; otherwise, if there is a declaration for
this attribute, and that declaration includes a default value, then that
default value is the attribute's effective value; otherwise, the
attribute does not exist on this element in the structure model until it
has been explicitly added. Note that the Node.nodeValue
attribute on the Attr instance can also be used to retrieve
the string version of the attribute's value(s).
If the attribute was not explicitly given a value in the instance
document but has a default value provided by the schema associated with
the document, an attribute node will be created with
specified set to false. Removing attribute
nodes for which a default value is defined in the schema generates a new
attribute node with the default value and specified set to
false. If validation occurred while invoking
Document.normalizeDocument(), attribute nodes with
specified equals to false are recomputed
according to the default attribute values provided by the schema. If no
default value is associate with this attribute in the schema, the
attribute node is discarded.
In XML, where the value of an attribute can contain entity references,
the child nodes of the Attr node may be either
Text or EntityReference nodes (when these are
in use; see the description of EntityReference for
discussion).
The DOM Core represents all attribute values as simple strings, even if the DTD or schema associated with the document declares them of some specific type such as tokenized.
The way attribute value normalization is performed by the DOM
implementation depends on how much the implementation knows about the
schema in use. Typically, the value and
nodeValue attributes of an Attr node initially
returns the normalized value given by the parser. It is also the case
after Document.normalizeDocument() is called (assuming the
right options have been set). But this may not be the case after
mutation, independently of whether the mutation is performed by setting
the string value directly or by changing the Attr child
nodes. In particular, this is true when character
references are involved, given that they are not represented in the DOM and they
impact attribute value normalization. On the other hand, if the
implementation knows about the schema in use when the attribute value is
changed, and it is of a different type than CDATA, it may normalize it
again at that time. This is especially true of specialized DOM
implementations, such as SVG DOM implementations, which store attribute
values in an internal form different from a string.
The following table gives some examples of the relations between the attribute value in the original document (parsed attribute), the value as exposed in the DOM, and the serialization of the value:
| Examples | Parsed attribute value | Initial Attr.value |
Serialized attribute value |
|---|---|---|---|
| Character reference |
"x²=5" |
"x²=5" |
"x²=5" |
| Built-in character entity |
"y<6" |
"y<6" |
"y<6" |
| Literal newline between |
"x=5 y=6" |
"x=5 y=6" |
"x=5 y=6" |
| Normalized newline between |
"x=5 y=6" |
"x=5 y=6" |
"x=5 y=6" |
Entity e with literal newline |
<!ENTITY e '... ...'> [...]> "x=5&e;y=6" |
Dependent on Implementation and Load Options | Dependent on Implementation and Load/Save Options |
See also the Document Object Model (DOM) Level 3 Core Specification.
Attr.CDATASection.Comment.DocumentFragment.Document.DocumentType.Element.Entity.EntityReference.Notation.ProcessingInstruction.Text node.newChild to the end of the list of children
of this node. If the newChild is already in the tree, it
is first removed.parentNode is null) and no user data. User
data associated to the imported node is not carried over. However, if
any UserDataHandlers has been specified along with the
associated data these handlers will be called with the appropriate
parameters before this method returns.
Element copies all attributes and their
values, including those generated by the XML processor to represent
defaulted attributes, but this method does not copy any children it
contains unless it is a deep clone. This includes text contained in
an the Element since the text is contained in a child
Text node. Cloning an Attr directly, as
opposed to be cloned as part of an Element cloning
operation, returns a specified attribute (specified is
true). Cloning an Attr always clones its
children, since they represent its value, no matter whether this is a
deep clone or not. Cloning an EntityReference
automatically constructs its subtree if a corresponding
Entity is available, no matter whether this is a deep
clone or not. Cloning any other type of node simply returns a copy of
this node.
EntityReference clone are readonly
. In addition, clones of unspecified Attr nodes are
specified. And, cloning Document,
DocumentType, Entity, and
Notation nodes is implementation dependent.NamedNodeMap containing the attributes of this node (if
it is an Element) or null otherwise.null if the
implementation wasn't able to obtain an absolute URI. This value is
computed as described in . However, when the Document
supports the feature "HTML" [DOM Level 2 HTML]
, the base URI is computed using first the value of the href
attribute of the HTML BASE element if any, and the value of the
documentURI attribute from the Document
interface otherwise.NodeList that contains all children of this node. If
there are no children, this is a NodeList containing no
nodes.Node
interface.null.null.ELEMENT_NODE and
ATTRIBUTE_NODE and nodes created with a DOM Level 1
method, such as Document.createElement(), this is always
null.Node.localName is
different from null, this attribute is a qualified name.null if it is
unspecified (see ).
ELEMENT_NODE and
ATTRIBUTE_NODE and nodes created with a DOM Level 1
method, such as Document.createElement(), this is always
null.
Note: Per the Namespaces in XML Specification [XML Namespaces] an attribute does not inherit its namespace from the element it is attached to. If an attribute is not explicitly given a namespace, it simply has no namespace.
null.null, setting it has no effect,
including if the node is read-only.Document object associated with this node. This is
also the Document object used to create new nodes. When
this node is a Document or a DocumentType
which is not used with any Document yet, this is
null.Element node this attribute is attached to or
null if this attribute is not in use.Attr,
Document, DocumentFragment,
Entity, and Notation may have a parent.
However, if a node has just been created and not yet added to the
tree, or if it has been removed from the tree, this is
null.null if it is
unspecified. When it is defined to be null, setting it
has no effect, including if the node is read-only.
nodeName attribute, which holds the qualified name, as
well as the tagName and name attributes of
the Element and Attr interfaces, when
applicable.
null makes it unspecified,
setting it to an empty string is implementation dependent.
namespaceURI and localName do not change.
ELEMENT_NODE and
ATTRIBUTE_NODE and nodes created with a DOM Level 1
method, such as createElement from the
Document interface, this is always null.null.Document.normalizeDocument(), schemaTypeInfo
may not be reliable if the node was moved.True if this attribute was explicitly given a value in
the instance document, false otherwise. If the
application changed the value of this attribute node (even if it ends
up having the same value as the default value) then it is set to
true. The implementation may handle attributes with
default values from other schemas similarly but applications should
use Document.normalizeDocument() to guarantee this
information is up-to-date.null, setting it
has no effect. On setting, any possible children this node may have
are removed and, if it the new string is not empty or
null, replaced by a single Text node
containing the string this attribute is set to.
Text.isElementContentWhitespace). Similarly, on setting,
no parsing is performed either, the input string is taken as pure
textual content.
| Node type | Content |
|---|---|
| ELEMENT_NODE, ATTRIBUTE_NODE, ENTITY_NODE, ENTITY_REFERENCE_NODE, DOCUMENT_FRAGMENT_NODE | concatenation of the textContent
attribute value of every child node, excluding COMMENT_NODE and
PROCESSING_INSTRUCTION_NODE nodes. This is the empty string if the
node has no children. |
| TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE, PROCESSING_INSTRUCTION_NODE | nodeValue |
| DOCUMENT_NODE, DOCUMENT_TYPE_NODE, NOTATION_NODE | null |
setUserData with the same key.getAttribute on the
Element interface.
Text node with the unparsed
contents of the string, i.e. any characters that an XML processor
would recognize as markup are instead treated as literal text. See
also the method Element.setAttribute().
newChild before the existing child node
refChild. If refChild is null,
insert newChild at the end of the list of children.
newChild is a DocumentFragment object,
all of its children are inserted, in the same order, before
refChild. If the newChild is already in the
tree, it is first removed.
Note: Inserting a node before itself is implementation dependent.
namespaceURI is the
default namespace or not.Node.isSameNode(). All nodes that are the
same will also be equal, though the reverse may not be true.
nodeName, localName,
namespaceURI, prefix, nodeValue
. This is: they are both null, or they have the same
length and are character for character identical.
attributes NamedNodeMaps are equal. This
is: they are both null, or they have the same length and
for each node that exists in one map there is a node that exists in
the other map and is equal, although not necessarily at the same
index.
childNodes NodeLists are equal.
This is: they are both null, or they have the same
length and contain equal nodes at the same index. Note that
normalization can affect equality; to avoid this, nodes should be
normalized before being compared.
DocumentType nodes to be equal, the following
conditions must also be satisfied:
publicId, systemId,
internalSubset.
entities
NamedNodeMaps are equal.
notations
NamedNodeMaps are equal.
ownerDocument, baseURI, and
parentNode attributes, the specified
attribute for Attr nodes, the schemaTypeInfo
attribute for Attr and Element nodes, the
Text.isElementContentWhitespace attribute for
Text nodes, as well as any user data or event listeners
registered on the nodes.
Note: As a general rule, anything not mentioned in the description above is not significant in consideration of equality checking. Note that future versions of this specification may take into account more attributes and implementations conform to this specification are expected to be updated accordingly.
ownerElement of this attribute
can be retrieved using the method Document.getElementById
. The implementation could use several ways to determine if an
attribute node is known to contain an identifier:
Document.normalizeDocument(), the post-schema-validation
infoset contributions (PSVI contributions) values are used to
determine if this attribute is a schema-determined ID attribute using
the
schema-determined ID definition in [XPointer]
.
Document.normalizeDocument(), the infoset [type definition] value is used to determine if this attribute is a DTD-determined ID
attribute using the
DTD-determined ID definition in [XPointer]
.
Element.setIdAttribute(),
Element.setIdAttributeNS(), or
Element.setIdAttributeNode(), i.e. it is an
user-determined ID attribute;
Note: XPointer framework (see section 3.2 in [XPointer] ) consider the DOM user-determined ID attribute as being part of the XPointer externally-determined ID definition.
Document.normalizeDocument(), all user-determined ID
attributes are reset and all attribute nodes ID information are then
reevaluated in accordance to the schema used. As a consequence, if
the Attr.schemaTypeInfo attribute contains an ID type,
isId will always return true.Node references returned by the implementation reference
the same object. When two Node references are references
to the same object, even if through a proxy, the references may be
used completely interchangeably, such that all attributes have the
same values and calling the same DOM method on either reference
always has exactly the same effect.Text nodes in the full depth of the sub-tree
underneath this Node, including attribute nodes, into a
"normal" form where only structure (e.g., elements, comments,
processing instructions, CDATA sections, and entity references)
separates Text nodes, i.e., there are neither adjacent
Text nodes nor empty Text nodes. This can
be used to ensure that the DOM view of a document is the same as if
it were saved and re-loaded, and is useful when operations (such as
XPointer [XPointer]
lookups) that depend on a particular document tree structure are to
be used. If the parameter "normalize-characters" of the
DOMConfiguration object attached to the
Node.ownerDocument is true, this method
will also fully normalize the characters of the Text
nodes.
Note: In cases where the document contains
CDATASections, the normalize operation alone may not be
sufficient, since XPointers do not differentiate between
Text nodes and CDATASection nodes.
oldChild from the list
of children, and returns it.oldChild with newChild
in the list of children, and returns the oldChild node.
newChild is a DocumentFragment object,
oldChild is replaced by all of the
DocumentFragment children, which are inserted in the
same order. If the newChild is already in the tree, it
is first removed.
Note: Replacing a node with itself is implementation dependent.
null, setting it has no effect,
including if the node is read-only.null if it is
unspecified. When it is defined to be null, setting it
has no effect, including if the node is read-only.
nodeName attribute, which holds the qualified name, as
well as the tagName and name attributes of
the Element and Attr interfaces, when
applicable.
null makes it unspecified,
setting it to an empty string is implementation dependent.
namespaceURI and localName do not change.
ELEMENT_NODE and
ATTRIBUTE_NODE and nodes created with a DOM Level 1
method, such as createElement from the
Document interface, this is always null.null, setting it
has no effect. On setting, any possible children this node may have
are removed and, if it the new string is not empty or
null, replaced by a single Text node
containing the string this attribute is set to.
Text.isElementContentWhitespace). Similarly, on setting,
no parsing is performed either, the input string is taken as pure
textual content.
| Node type | Content |
|---|---|
| ELEMENT_NODE, ATTRIBUTE_NODE, ENTITY_NODE, ENTITY_REFERENCE_NODE, DOCUMENT_FRAGMENT_NODE | concatenation of the textContent
attribute value of every child node, excluding COMMENT_NODE and
PROCESSING_INSTRUCTION_NODE nodes. This is the empty string if the
node has no children. |
| TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE, PROCESSING_INSTRUCTION_NODE | nodeValue |
| DOCUMENT_NODE, DOCUMENT_TYPE_NODE, NOTATION_NODE | null |
getUserData with the
same key.getAttribute on the
Element interface.
Text node with the unparsed
contents of the string, i.e. any characters that an XML processor
would recognize as markup are instead treated as literal text. See
also the method Element.setAttribute().