Hi Tim,
An update to my previous post, the following function is a replacement for
the first example I gave. This function does not need a namespace prefix
to be declared in the prolog of your query to work.
------------------------------------------------------------------
(:~
: Recursively adds a namespace to all elements in an XML document.
:
: Takes an element() or a document-node() as input,
: Returns the equivalent XML structure, with namespaces attached.
:
: @param $node an element() or document-node() to attach a namespace to
: @param $namespace the default namespace to assign all elements to
: @return an element() node, with namespaces attached to every descendant
: @author Charles Foster
:)
declare function local:namespace-insert(
$node as node(),
$namespace as xs:string) as node()?
{
typeswitch($node)
case $a as element() return
element { fn:QName($namespace, fn:local-name($a)) } {
$a/@*,
for $x in $a/node()
return local:namespace-insert($x, $namespace)
}
case $a as document-node()
return local:namespace-insert($a/element(), $namespace)
default return $node
};
------------------------------------------------------------------
Regards,
Charles
> Hi Tim,
>
> Failing Load-Time Default Namespace Assignment with xdmp:document-load as
> Mike has pointed out, if you wish to use xdmp:document-insert, you have at
> least two further options:
>
> 1. Recursively add a namespace to each element of your dynamically
> constructed XML document, for instance:
>
> ------------------------------------------------------------------
>
> declare namespace ns = "uri:new-namespace";
>
> (:~
> : Recursively adds a namespace to all elements in an XML document.
> :
> : Takes an element() or a document-node() as input,
> : Returns the equivalent XML structure, with namespaces attached.
> : NOTE:
> : RELIES on the namespace prefix "ns" being declared in the prolog.
> :
> : @param $node an element() or document-node() to attach a namespace to
> : @return an element() node, with namespaces attached to every descendant
> : @author Charles Foster
> :)
> declare function local:namespace-insert($node as node()) as node()?
> {
> typeswitch($node)
> case $a as element() return
> element { fn:concat("ns:",fn:local-name($a)) } {
> $a/@*,
> for $x in $a/node()
> return local:namespace-insert($x)
> }
> case $a as document-node() return local:namespace-insert($a/element())
> default return $node
> };
>
> ------------------------------------------------------------------
>
> 2. Add a default namespace to the root level element, via a Regular
> Expression replace:
>
> ------------------------------------------------------------------
>
> (:~
> : Fast function to attach a namespace to a namespace-less XML document.
> :
> : Takes a valid XML Document serialized as an xs:string for input,
> : returns an XML Document also serialized as an xs:string with a
> : namespace attached.
> :
> : @param $doc a valid XML Document serialized as an xs:string.
> : @param $namespace the namespace URI which to attach to the document.
> : @return xs:string representation of an XML document.
> : @author Charles Foster
> :)
> declare function local:attach-namespace(
> $doc as xs:string,
> $namespace as xs:string) as xs:string
> {
> fn:replace($doc,
> fn:concat("^(<[a-zA-Z0-9_-]*)([^>]*)(.*)"),
> fn:concat("$1$2 xmlns="",$namespace,""$3"))
> };
>
> ------------------------------------------------------------------
>
> If you are inserting large XML documents, or are inserting many XML
> documents and performance is important to you, I would suggest using the
> Regular Expression replace option.
>
> Ideally, it would be best to attach a default namespace to the XML
> structure before adding it to MarkLogic in the first place.
>
> Would you mind if I asked where you're getting the XML documents from and
> what programming environment you are using e.g. Java / C# / C++, if at
> all?
>
> Regards,
>
> Charles
>
>> There is a <default_namespace> option you can use with
>> xdmp:document-load that could help.
>>
>> -Mike
>>
>> Tim Meagher wrote:
>>>
>>> Hi Folks,
>>>
>>>
>>>
>>> I have some XML content that is missing namespace declarations that
>>> I'm trying to insert into MarkLogic. I don't know if this is a common
>>> problem, especially when dealing with documents that reference DTDs by
>>> location in a file system and which might expect the namespace
>>> declarations to be included as entities in the DTD.
>>>
>>>
>>>
>>> Is there a simple way to have namespaces added to a document during
>>> the insert? I'm wondering if I have to create a precommit trigger
>>> that adds the namespace to the document prior to inserting it, but it
>>> would be nice if there was just a simple way of adding the namespaces
>>> during the insert.
>>>
>>>
>>>
>>> Thank you!
>>>
>>>
>>>
>>> Tim Meagher
>>>
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> General mailing list
>>> [email protected]
>>> http://xqzone.com/mailman/listinfo/general
>>>
>> _______________________________________________
>> General mailing list
>> [email protected]
>> http://xqzone.com/mailman/listinfo/general
>>
>
> _______________________________________________
> General mailing list
> [email protected]
> http://xqzone.com/mailman/listinfo/general
>
_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general