Hi Tim, That is because you are using computed element constructors, creating list elements explicitly without namespaces (since you pass in the result of a call to local-name()). Also, you should not created xmlns attributes directly, but supply the element constructor with a xs:QName that contains the element name in the desired namespace.
I think you are looking for something like this: declare namespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; declare namespace pre = "http://mystuff.com/pre"; declare variable $sd := "http://mystuff.com/schema"; declare function pre:passthru-nodeset($x as node()) as node()* { for $z in $x/(@* | node()) return pre:build-nodeset($z) }; declare function pre:build-nodeset($x as node()) as node()* { (:Revise link counts, clean up link, add link attributes to mixed-citation:) typeswitch ($x) case text() return $x case attribute () return $x case element () return element {QName($sd, local-name($x))} { if (not($x/parent::*)) then attribute xsi:schemaLocation { "/the-schema.xsd" } else (), pre:passthru-nodeset($x) } default return pre:passthru-nodeset($x) }; let $record := <record bla="boo"><list type="unknown"><item/></list></record> return pre:build-nodeset($record) Note: you might be interested in the functions available at http://www.xqueryfunctions.com/xq/. They are included in the distribution of MarkLogic Server 4.1.. Kind regards, Geert > drs. G.P.H. (Geert) Josten Consultant Daidalos BV Hoekeindsehof 1-4 2665 JZ Bleiswijk T +31 (0)10 850 1200 F +31 (0)10 850 1199 mailto:[email protected] http://www.daidalos.nl/ KvK 27164984 P Please consider the environment before printing this mail. De informatie - verzonden in of met dit e-mailbericht - is afkomstig van Daidalos BV en is uitsluitend bestemd voor de geadresseerde. Indien u dit bericht onbedoeld hebt ontvangen, verzoeken wij u het te verwijderen. Aan dit bericht kunnen geen rechten worden ontleend. > From: [email protected] > [mailto:[email protected]] On Behalf Of > Tim Meagher > Sent: donderdag 4 maart 2010 4:43 > To: 'General Mark Logic Developer Discussion' > Subject: [MarkLogic Dev General] Problem inserting default > namespace in created XML document > > Hi Folks, > > > > I'm trying to take an XML document that refers to a DTD and > to remove the DTD declaration and insert a default namespace. > I built a recursive function that goes thru each node: > > > > declare namespace pre = "http://mystuff.com/pre"; > > > > declare function pre:passthru-nodeset($x as node()) as node()* { > for $z in $x/(@* | node()) return pre:build-nodeset($z) }; > > > > declare function pre:build-nodeset($x as node()) as node()* { > (:Revise link counts, clean up link, add link attributes to > mixed-citation:) > typeswitch ($x) > case text() return $x > case attribute () return $x > case element (record) > return > element record { > attribute xsi:schemaLocation { "/the-schema.xsd" }, > attribute xmlns:xsi > {"http://www.w3.org/2001/XMLSchema-instance"}, > attribute xmlns {"http://mystuff.com/schema"}, > pre:passthru-nodeset($x)} > case element () > return element {string(local-name($x))} { > pre:passthru-nodeset($x)} > default return pre:passthru-nodeset($x) }; > > > > The problem is that the resulting XML document from invoking > pre:build-nodeset($record) looks something like this: > > > > <record xsi:schemaLocation="/APAthe-schema.xsd" id="1001" > > xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance > > xmlns="http://mystuff.com/schema"> > <list xmlns=""> > <item> > ... > > > > and when I try to validate the resulting document a > validation error occurs because the default namespace has > been renamed at the <list> element. How can I remove the > xmlns="" declaration from the <list> element? > > > > Thanks ahead of time, > > > > Tim Meagher > > _______________________________________________ General mailing list [email protected] http://xqzone.com/mailman/listinfo/general
