|
From: Michael W. <wes...@ja...> - 2021-07-06 10:20:04
|
Hi Alfredo,
This is a simple one, recursively adding the tokenized strings as the
element names:
xquery version "3.0";
declare function local:append-child($tokens as xs:string*) as element()? {
if (count($tokens) ge 1)
then element {$tokens[1]} {
local:append-child(subsequence($tokens, 2))
}
else ()
};
let $string := 'teiHeader/fileDesc/titleStmt/title'
let $tokens := tokenize($string, '/')
return element {$tokens[1]} {
local:append-child(subsequence($tokens, 2))
}
Drop that into a new eXide XQuery and this is the result:
[image: image.png]
It helps to understand Functional Programming to really grasp XQuery. The
pseudo-code version of the above is:
- Declare a recursive function named local:append-child that takes an
array of strings (0 or more) as the parameter
- If there are any tokens, create an element names with the first
string token
- Append child elements starting with the second token
- Otherwise, return the empty set
The main part of the program is:
- Assign "teiHeader/fileDesc/titleStmt/title" to $string
- Break $string into tokens by dividing the string at each "/"
- Create an element with the name of the first token
- Append child elements starting with the second token
Hope this helps give you an idea of how to approach this.
Take care.
2021年7月6日(火) 18:26 Alfredo Cosco <alf...@gm...>:
> Hi all,
> I'm working on eXist 4.7.
> I have a string like this:
> teiHeader/fileDesc/titleStmt/title
>
> Is there a way to transform it and store in a node like:
> <teiHeader>
> <fileDesc>
> <titleStmt>
> <title/>
> <titleStmt>
> </fileDesc>
> </teiHeader>
>
> Thanks,
> Alfredo
> _______________________________________________
> Exist-open mailing list
> Exi...@li...
> https://lists.sourceforge.net/lists/listinfo/exist-open
>
--
Michael Westbay
Writer/System Administrator
http://www.japanesebaseball.com/
|