home contribute faq download

FunctX XQuery Functions

functx:remove-elements-deep

Removes descendant elements from an XML node, based on name

Google
Webxqueryfunctions.com

Description

The functx:remove-elements-deep function removes descendant elements from all of the nodes in $nodes based on name. The $names argument is a sequence of strings that represent element names to remove. Prefixes can (and must) be used in the $names values for elements that are prefixed in the input documents. You can also specify wildcard values "*", "*:" and ":*" in the second argument. See the description for functx:name-test for details.

Note: this function is intended to change the way elements appear in the results of a query, not to update them in an XML database. To update your XML database, you should use the implementation-specific update functions of your processor.

Arguments and Return Type

NameTypeDescription
$nodes node()* root(s) to start from
$names xs:string* the names of the elements to remove
return value node()*

XQuery Function Declaration

See XSLT definition.
declare namespace functx = "http://www.functx.com";
declare function functx:remove-elements-deep
  ( $nodes as node()* ,
    $names as xs:string* )  as node()* {

   for $node in $nodes
   return
     if ($node instance of element())
     then if (functx:name-test(name($node),$names))
          then ()
          else element { node-name($node)}
                { $node/@*,
                  functx:remove-elements-deep($node/node(), $names)}
     else if ($node instance of document-node())
     then functx:remove-elements-deep($node/node(), $names)
     else $node
 } ;

Examples

let $in-xml-1 :=
<in-xml>
   <a>
      <b>b1</b>
      <c>c1</c>
   </a>
   <c>Mixed <b>content</b></c>
</in-xml>
let $in-xml-2 :=
<in-xml xmlns:x="http://x">
   <a>
      <x:b>b1</x:b>
      <c>c1</c>
   </a>
   <c>Mixed <b>content</b></c>
</in-xml>
return
XQuery ExampleResults
functx:remove-elements-deep(
     $in-xml-1,
     'b')
<in-xml>
  <a>
    <c>c1</c>
  </a>
  <c>Mixed </c>
</in-xml>
functx:remove-elements-deep(
     $in-xml-1,
     'a')
<in-xml>
  <c>Mixed <b>content</b>
  </c>
</in-xml>
functx:remove-elements-deep(
     $in-xml-1,
     ('b','c'))
<in-xml>
  <a/>
</in-xml>
functx:remove-elements-deep(
     $in-xml-2,
     'x:b')
<in-xml>
  <a>
    <c>c1</c>
  </a>
  <c>Mixed <b>content</b>
  </c>
</in-xml>

Depends On

functx:name-testWhether a name matches a list of names or name wildcards

See Also

functx:remove-elementsRemoves child elements from an XML node, based on name
functx:remove-elements-not-contentsRemoves descendant XML elements but keeps their content

History

Published OnLast UpdatedContributor(s)
2006-06-272007-02-26Priscilla Walmsley, Datypic, pwalmsley@datypic.com, http://www.datypic.com
Datypic XQuery Services

Recommended Reading:

XQuery