DB2 Version 9.7 for Linux, UNIX, and Windows

XMLELEMENT scalar function

Read syntax diagramSkip visual syntax diagram
>>-XMLELEMENT--(--NAME--element-name---------------------------->

>--+------------------------------+----------------------------->
   '-,--xmlnamespaces-declaration-'   

>--+---------------------------+-------------------------------->
   '-,--xmlattributes-function-'   

>--+-----------------------------------+------------------------>
   | .-------------------------------. |   
   | V                               | |   
   '---,--element-content-expression-+-'   

>--+----------------------------------------------------------+-->
   |             .------------------------------------------. |   
   |        (1)  V   .-EMPTY ON NULL-. (2)              (3) | |   
   '-OPTION--------+-+-NULL ON NULL--+----------------+-----+-'   
                   |              .-USING-.           |           
                   | .-XMLBINARY--+-------+--BASE64-. |           
                   | |            .-USING-.         | |           
                   '-+-XMLBINARY--+-------+--HEX----+-'           

>--)-----------------------------------------------------------><

Notes:
  1. The OPTION clause can only be specified if at least one xmlattributes-function or element-content-expression is specified.
  2. NULL ON NULL or EMPTY ON NULL can only be specified if at least one element-content-expression is specified.
  3. The same clause must not be specified more than once.

The schema is SYSIBM. The function name cannot be specified as a qualified name.

The XMLELEMENT function returns an XML value that is an XQuery element node.

NAME element-name
Specifies the name of an XML element. The name is an SQL identifier that must be in the form of an XML qualified name, or QName (SQLSTATE 42634). See the W3C XML namespace specifications for more details on valid names. If the name is qualified, the namespace prefix must be declared within the scope (SQLSTATE 42635).
xmlnamespaces-declaration
Specifies the XML namespace declarations that are the result of the XMLNAMESPACES declaration. The namespaces that are declared are in the scope of the XMLELEMENT function. The namespaces apply to any nested XML functions within the XMLELEMENT function, regardless of whether or not they appear inside another subselect.

If xmlnamespaces-declaration is not specified, namespace declarations are not associated with the constructed element.

xmlattributes-function
Specifies the XML attributes for the element. The attributes are the result of the XMLATTRIBUTES function.
element-content-expression
The content of the generated XML element node is specified by an expression or a list of expressions. The data type of element-content-expression cannot be a structured type (SQLSTATE 42884). The expression can be any SQL expression.

If element-content-expression is not specified, an empty string is used as the content for the element and OPTION NULL ON NULL or EMPTY ON NULL must not be specified.

OPTION
Specifies additional options for constructing the XML element. If no OPTION clause is specified, the default is EMPTY ON NULL XMLBINARY USING BASE64. This clause has no impact on nested XMLELEMENT invocations specified in element-content-expression.
EMPTY ON NULL or NULL ON NULL
Specifies whether a null value or an empty element is to be returned if the values of each element-content-expression is a null value. This option only affects null handling of element contents, not attribute values. The default is EMPTY ON NULL.
EMPTY ON NULL
If the value of each element-content-expression is null, an empty element is returned.
NULL ON NULL
If the value of each element-content-expression is null, a null value is returned.
XMLBINARY USING BASE64 or XMLBINARY USING HEX
Specifies the assumed encoding of binary input data, character string data with the FOR BIT DATA attribute, or a distinct type that is based on one of these types. The encoding applies to element content or attribute values. The default is XMLBINARY USING BASE64.
XMLBINARY USING BASE64
Specifies that the assumed encoding is base64 characters, as defined for XML schema type xs:base64Binary encoding. The base64 encoding uses a 65-character subset of US-ASCII (10 digits, 26 lowercase characters, 26 uppercase characters, '+', and '/') to represent every six bits of the binary or bit data with one printable character in the subset. These characters are selected so that they are universally representable. Using this method, the size of the encoded data is 33 percent larger than the original binary or bit data.
XMLBINARY USING HEX
Specifies that the assumed encoding is hexadecimal characters, as defined for XML schema type xs:hexBinary encoding. The hexadecimal encoding represents each byte (8 bits) with two hexadecimal characters. Using this method, the encoded data is twice the size of the original binary or bit data.

This function takes an element name, an optional collection of namespace declarations, an optional collection of attributes, and zero or more arguments that make up the content of the XML element. The result is an XML sequence containing an XML element node or the null value.

The data type of the result is XML. If any of the element-content-expression arguments can be null, the result can be null; if all the element-content-expression argument values are null and the NULL ON NULL option is in effect, the result is the null value.

Note:
  1. When constructing elements that will be copied as content of another element that defines default namespaces, default namespaces should be explicitly undeclared in the copied element to avoid possible errors that could result from inheriting the default namespace from the new parent element. Predefined namespace prefixes ('xs', 'xsi', 'xml', and 'sqlxml') must also be declared explicitly when they are used.
  2. Constructing an element node: The resulting element node is constructed as follows:
    1. The xmlnamespaces-declaration adds a set of in-scope namespaces for the constructed element. Each in-scope namespace associates a namespace prefix (or the default namespace) with a namespace URI. The in-scope namespaces define the set of namespace prefixes that are available for interpreting QNames within the scope of the element.
    2. If the xmlattributes-function is specified, it is evaluated and the result is a sequence of attribute nodes.
    3. Each element-content-expression is evaluated and the result is converted into a sequence of nodes as follows:
      • If the result type is not XML, it is converted to an XML text node whose content is the result of element-content-expression mapped to XML according to the rules of mapping SQL data values to XML data values (see the table that describes supported casts from non-XML values to XML values in "Casting between data types").
      • If the result type is XML, then in general the result is a sequence of items. Some of the items in that sequence might be document nodes. Each document node in the sequence is replaced by the sequence of its top-level children. Then for each node in the resulting sequence, a new deep copy of the node is constructed, including its children and attributes. Each copied node has a new node identity. Copied element and attribute nodes preserve their type annotation. For each adjacent sequence of one or more atomic values returned in the sequence, a new text node is constructed, containing the result of casting each atomic value to a string, with a single blank character inserted between adjacent values. Adjacent text nodes in the content sequence are merged into a single text node by concatenating their contents, with no intervening blanks. After concatenation, any text node whose content is a zero-length string is deleted from the content sequence.
    4. The result sequence of XML attributes and the resulting sequences of all element-content-expression specifications are concatenated into one sequence which is called the content sequence. Any sequence of adjacent text nodes in the content sequence is merged into a single text node. If all the element-content-expression arguments are empty strings, or an element-content-expression argument is not specified, an empty element is returned.
    5. The content sequence must not contain an attribute node following a node that is not an attribute node (SQLSTATE 10507). Attribute nodes occurring in the content sequence become attributes of the new element node. Two or more of these attribute nodes must not have the same name (SQLSTATE 10503). A namespace declaration is created corresponding to any namespace used in the names of the attribute nodes if the namespace URI is not in the in-scope namespaces of the constructed element.
    6. Element, text, comment, and processing instruction nodes in the content sequence become the children of the constructed element node.
    7. The constructed element node is given a type annotation of xs:anyType, and each of its attributes is given a type annotation of xdt:untypedAtomic. The node name of the constructed element node is element-name specified after the NAME keyword.
  3. Rules for using namespaces within XMLELEMENT: Consider the following rules about scoping of namespaces:
    • The namespaces declared in the XMLNAMESPACES declaration are the in-scope namespaces of the element node constructed by the XMLELEMENT function. If the element node is serialized, then each of its in-scope namespaces will be serialized as a namespace attribute unless it is an in-scope namespace of the parent of the element node and the parent element is serialized too.
    • If an XMLQUERY or XMLEXISTS is in an element-content-expression, then the namespaces becomes the statically known namespaces of the XQuery expression of the XMLQUERY or XMLEXISTS. Statically known namespaces are used to resolve the QNames in the XQuery expression. If the XQuery prolog declares a namespace with the same prefix, within the scope of the XQuery expression, the namespace declared in the prolog will override the namespaces declared in the XMLNAMESPACES declaration.
    • If an attribute of the constructed element comes from an element-content-expression, its namespace might not already be declared as an in-scope namespace of the constructed element, in this case, a new namespace is created for it. If this would result in a conflict, which means that the prefix of the attribute name is already bound to a different URI by a in-scope namespace, DB2® generates a prefix that does not cause such a conflict and the prefix used in the attribute name is changed to the new prefix, and a namespace is created for this new prefix. The generated new prefix follows the following pattern: "db2ns-xx", where "x" is a character chosen from the set [A-Z,a-z,0-9]. For example:
         VALUES XMLELEMENT(
           NAME "c", XMLQUERY(
             'declare namespace ipo="www.ipo.com"; $m/ipo:a/@ipo:b'
               PASSING XMLPARSE(
                 DOCUMENT '<tst:a xmlns:tst="www.ipo.com" tst:b="2"/>'
               ) AS "m"
           )
         )
      returns:
      <c xmlns:tst="www.ipo.com" tst:b="2"/>
      A second example:
         VALUES XMLELEMENT(
           NAME "tst:c", XMLNAMESPACES(
             'www.tst.com' AS "tst"
           ),
           XMLQUERY(
             'declare namespace ipo="www.ipo.com"; $m/ipo:a/@ipo:b'
               PASSING XMLPARSE(
                 DOCUMENT '<tst:a xmlns:tst="www.ipo.com" tst:b="2"/>'
               ) AS "m"
           )
         )
      returns:
      <tst:c xmlns:tst="www.tst.com" xmlns:db2ns-a1="www.ipo.com"
        db2ns-a1:b="2"/>

Examples:

Note: XMLELEMENT does not insert blank spaces or new line characters in the output. All example output has been formatted to enhance readability.