[xquery-talk] Namespace conflict ?

Leo Studer leo.studer at varioweb.ch
Wed Sep 17 08:19:41 PDT 2014


Thank you Michael. In this view, changing the default namespace, the pair (“”,uri1) to (“”, uri2) is a potential conflict, I can see that. 
However, adding a default namespace when no namespace is defined - in the (prefix, uri) view, I would see that as changing (“”,””) to (“”, uri1) - seems quite similar to me...

Don’t worry, I was just intrigued ;-)

Always
Leo




On 17 Sep 2014, at 12:15, Michael Kay <mike at saxonica.com> wrote:

> 
>> Christian, thank you for your lines. 
>> 
>>> This is different in the second case. The specification [1] says that
>>> "If the namespace binding of $QName conflicts with any namespace
>>> binding in the namespaces property of $target, a dynamic error is
>>> raised [err:XUDY0023].". This is why an error is raised if a namespace
>>> already exists.
>> 
>> When I prefix the new name, it works, even though the namespace binding is the same. 
> 
> A namespace binding is a (prefix, uri) pair, so when you prefix the name there is a new (prefix, uri) pair which doesn't confllct with any existing (prefix, uri) pair. Does that clarify?
> 
> Michael Kay
> Saxonica
> 
>> 
>> declare namespace gym='http://www.mygym.com';
>> 
>> let $i:=(doc("FitnessCenter.xml")//gym:Name)[1]
>> 
>> return rename node $i as QName('http://www.gym.com', “gym:Name")
>> with
>> <?xml version="1.0" encoding="UTF-8"?>
>> 
>> <FitnessCenter xmlns="http://www.mygym.com">
>> <Member Level="platinum">
>>     <Name>Jeff</Name>
>>     <FavoriteColor>lightgrey</FavoriteColor>
>> </Member>
>> </FitnessCenter>
>> 
>> I cannot see the namespace conflict.
>> Thanks anyway
>> Always
>> Leo
>> 
>> 
>> 
>> 
>>> 
>>> Hope this helps,
>>> Christian
>>> 
>>> [1] http://www.w3.org/TR/xquery-update-10/#id-rename
>>> 
>>> 
>>> 
>>>>> The problem is that your original document
>>>>> uses the default namespace "http://www.mygym.com", and your query uses
>>>>> "http://www.gym.com". In other words, the error is raised because the
>>>>> namespace binding of your target name conflicts with the existing
>>>>> namespace binding.
>>>> 
>>>> That I don't get.
>>>> 
>>>> This works
>>>> let $i:=(doc("FitnessCenter.xml")//Name)[1]
>>>> 
>>>> return rename node $i as QName('http://www.gym.com', "Name")
>>>> with
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> 
>>>> <FitnessCenter>
>>>> <Member Level="platinum">
>>>>     <Name>Jeff</Name>
>>>>     <FavoriteColor>lightgrey</FavoriteColor>
>>>> </Member>
>>>> </FitnessCenter>
>>>> 
>>>> This not
>>>> 
>>>> declare namespace gym='http://www.mygym.com';
>>>> 
>>>> let $i:=(doc("FitnessCenter.xml")//gym:Name)[1]
>>>> 
>>>> return rename node $i as QName('http://www.gym.com', "Name")
>>>> with
>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>> 
>>>> <FitnessCenter xmlns="http://www.mygym.com">
>>>> <Member Level="platinum">
>>>>     <Name>Jeff</Name>
>>>>     <FavoriteColor>lightgrey</FavoriteColor>
>>>> </Member>
>>>> </FitnessCenter>
>>>> 
>>>> 
>>>> 
>>>> Why should that conflict?
>>>> Always
>>>> Leo
>>>> 
>>>> 
>>>> 
>>>> 
>>>>> 
>>>>> Here is a recursive approach to change the default namespace of a document:
>>>>> ______________________________________
>>>>> 
>>>>> declare function local:update($root as node(), $ns as xs:string) {
>>>>> if($root instance of element()) then (
>>>>> element { QName($ns, local-name($root)) } {
>>>>>  $root/@*,
>>>>>  for $node in $root/node()
>>>>>  return local:update($node, $ns)
>>>>> }
>>>>> ) else (
>>>>> $root
>>>>> )
>>>>> };
>>>>> 
>>>>> let $ns := 'http://www.gym.com'
>>>>> let $root := doc("FitnessCenter.xml")/*
>>>>> let $updated := local:update($root, $ns)
>>>>> return replace node $root with $updated
>>>>> ______________________________________
>>>>> 
>>>>> Hope this helps,
>>>>> Christian
>>>>> 
>>>>> 
>>>>> 
>>>>> On Tue, Sep 16, 2014 at 12:10 PM, Leo Studer <leo.studer at varioweb.ch> wrote:
>>>>>> Hello
>>>>>> 
>>>>>> I use the following query with Saxon-EE xQuery 9.5.1.5 in Oxygen.
>>>>>> 
>>>>>> for $i in doc('FitnessCenter.xml')//*
>>>>>>    return rename node $i as QName('http://www.gym.com', local-name($i))
>>>>>> 
>>>>>> 
>>>>>> on the following file:
>>>>>> 
>>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>>> <FitnessCenter xmlns="http://www.mygym.com">
>>>>>>    <Member Level="platinum">
>>>>>>            <Name>Jeff</Name>
>>>>>>            <FavoriteColor>lightgrey</FavoriteColor>
>>>>>>    </Member>
>>>>>>    <Member Level="gold">
>>>>>>            <Name>David</Name>
>>>>>>            <FavoriteColor>lightblue</FavoriteColor>
>>>>>>    </Member>
>>>>>> </FitnessCenter>
>>>>>> 
>>>>>> and get the following error: new name conflicts with existing namespace binding
>>>>>> 
>>>>>> 
>>>>>> I thought the function local-name() produces an output  without namespace binding? Can anyone explain?
>>>>>> 
>>>>>> Thanks in advance
>>>>>> Leo
>>>>>> 
>>>>>> 
>>>>>> _______________________________________________
>>>>>> talk at x-query.com
>>>>>> http://x-query.com/mailman/listinfo/talk
>>>> 
>>>> 
>>>> _______________________________________________
>>>> talk at x-query.com
>>>> http://x-query.com/mailman/listinfo/talk
>> 
>> 
>> _______________________________________________
>> talk at x-query.com
>> http://x-query.com/mailman/listinfo/talk
> 




More information about the talk mailing list