home contribute faq download

FunctX XQuery Functions

functx:dynamic-path

Dynamically evaluates a simple XPath path

Google
Webxqueryfunctions.com

Description

The functx:dynamic-path function dynamically evaluates a simple path expression. The function only supports element names and attribute names preceded by @, separated by single slashes. The names can optionally be prefixed, but they must use the same prefix that is used in the input document. It does not support predicates, other axes or other node kinds. Note that most processors have an extension function that evaluates path expressions dynamically in a much more complete way.

Arguments and Return Type

NameTypeDescription
$parent node() the root to start from
$path xs:string the path expression
return value item()*

XQuery Function Declaration

See XSLT definition.
declare namespace functx = "http://www.functx.com";
declare function functx:dynamic-path
  ( $parent as node() ,
    $path as xs:string )  as item()* {

  let $nextStep := functx:substring-before-if-contains($path,'/')
  let $restOfSteps := substring-after($path,'/')
  for $child in
    ($parent/*[functx:name-test(name(),$nextStep)],
     $parent/@*[functx:name-test(name(),
                              substring-after($nextStep,'@'))])
  return if ($restOfSteps)
         then functx:dynamic-path($child, $restOfSteps)
         else $child
 } ;

Examples

let $in-xml :=
<authors>
   <author test="abc">
      <first>Kate</first>
      <last>Jones</last>
   </author>
   <author>
      <first>John</first>
      <a:last xmlns:a="http://a">Doe</a:last>
   </author>
</authors>
return
XQuery ExampleResults
functx:dynamic-path(
     $in-xml,'author/first')
<first>Kate</first>
<first>John</first>
name(functx:dynamic-path(
     $in-xml,'author/@test'))
test
functx:dynamic-path(
     $in-xml,'author')
<author test="abc">
  <first>Kate</first>
  <last>Jones</last>
</author>
<author>
  <first>John</first>
  <a:last xmlns:a="http://a">Doe</a:last>
</author>
functx:dynamic-path(
     $in-xml,'author/a:last')
<a:last xmlns:a="http://a">Doe</a:last>

Depends On

functx:substring-before-if-containsPerforms substring-before, returning the entire string if it does not contain the delimiter
functx:name-testWhether a name matches a list of names or name wildcards

See Also

functx:path-to-nodeA path to an XML node (or sequence of nodes)

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