1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
(:**************************************************************:)
(: Test: functx-functx-remove-elements-not-contents-1 :)
(: Written by: Priscilla Walmsley (Frans Englich is maintainer) :)
(: Date: 2008-05-16+02:00 :)
(:**************************************************************:)
declare namespace functx = "http://www.example.com/";
(:~
: Whether a name matches a list of names or name wildcards
:
: @author Priscilla Walmsley, Datypic
: @version 1.0
: @see http://www.xqueryfunctions.com/xq/functx_name-test.html
: @param $testname the name to test
: @param $names the list of names or name wildcards
:)
declare function functx:name-test
( $testname as xs:string? ,
$names as xs:string* ) as xs:boolean {
$testname = $names
or
$names = '*'
or
functx:substring-after-if-contains($testname,':') =
(for $name in $names
return substring-after($name,'*:'))
or
substring-before($testname,':') =
(for $name in $names[contains(.,':*')]
return substring-before($name,':*'))
} ;
(:~
: Removes descendant XML elements but keeps their content
:
: @author Priscilla Walmsley, Datypic
: @version 1.0
: @see http://www.xqueryfunctions.com/xq/functx_remove-elements-not-contents.html
: @param $nodes the root(s) to start from
: @param $names the names of the elements to remove
:)
declare function functx:remove-elements-not-contents
( $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 functx:remove-elements-not-contents($node/node(), $names)
else element {node-name($node)}
{$node/@*,
functx:remove-elements-not-contents($node/node(),$names)}
else if ($node instance of document-node())
then functx:remove-elements-not-contents($node/node(), $names)
else $node
} ;
(:~
: Performs substring-after, returning the entire string if it does not contain the delimiter
:
: @author Priscilla Walmsley, Datypic
: @version 1.0
: @see http://www.xqueryfunctions.com/xq/functx_substring-after-if-contains.html
: @param $arg the string to substring
: @param $delim the delimiter
:)
declare function functx:substring-after-if-contains
( $arg as xs:string? ,
$delim as xs:string ) as xs:string? {
if (contains($arg,$delim))
then substring-after($arg,$delim)
else $arg
} ;
let $in-xml-1 := <in-xml>
<a>
<b>b1</b>
<c>c1</c>
</a>
<c>Mixed <b>content</b></c>
</in-xml>
return
let $in-xml-2 := <in-xml xmlns:x="http://x">
<a>
<b>b1</b>
<c>c1</c>
</a>
<c>Mixed <x:b>content</x:b></c>
</in-xml>
return (functx:remove-elements-not-contents(
$in-xml-1, 'b'))
|