BaseXdb / basex

BaseX Main Repository.
http://basex.org
BSD 3-Clause "New" or "Revised" License
684 stars 265 forks source link

XQuery Update: Nodes in the xml namespace #2227

Closed ChristianGruen closed 1 year ago

ChristianGruen commented 1 year ago

The following query raises an unexpected error:

<e a=''/> update { insert node attribute xml:a { '' } into . }

The expected result:

<e a="" xml:a=""/>

Related (no error should be raised):

<e/> update {
  insert nodes (attribute a { '' }, attribute xml:a { '' }) into .
}
ekimbernow commented 1 year ago

Using this test query:

(: Test handling of @xml:base att :)

let $doc1 as element() := <root/>
let $doc2 as element() := <root base="base attribute"/>
let $doc2prime as element() := <root base="base attribute"/>
let $doc3 as element() := <root xml:base="/foo/bar.xml"/>

let $xmlBaseAtt as attribute() := attribute {'xml:base'}{'/foo/bar.xml'}
let $baseAtt as attribute() := attribute {'base'}{'base att'}
let $transformed1 as element() := 
try {
  $doc1 transform with { insert node $xmlBaseAtt into .}  
} catch * {
  <error code="{$err:code}" desc="{$err:description}" object="doc1">{$doc1}</error>
}

let $transformed2 as element() := 
try {
  $doc2 transform with { insert node $xmlBaseAtt into .}  
} catch * {
  <error code="{$err:code}" desc="{$err:description}" object="doc2">{$doc2}</error>
}

let $transformed3 as element() := 
try {
  $doc3 transform with { insert node $baseAtt into .}  
} catch * {
  <error code="{$err:code}" desc="{$err:description}" object="doc3">{$doc3}</error>
}

let $transformed4 as element() := 
try {
  $doc2 transform with { insert node $doc3/@xml:base into .}  
} catch * {
  <error code="{$err:code}" desc="{$err:description}" object="doc2">{$doc2}</error>
}

let $transformed5 as element() := 
  try {
    $doc2prime transform with { 
     (rename node ./@base as 'xbase',
      insert node $doc3/@xml:base into .,
      ()
     )
  }  
  } catch * {
    <error code="{$err:code}" desc="{$err:description}" object="doc2prime">{$doc2prime}</error>
  }
let $transformed5 as element() := 
  try {
    $transformed5 transform with { 
     (rename node ./@xbase as 'base',
      ()
     )
  }  
  } catch * {
    <error code="{$err:code}" desc="{$err:description}" object="transformed5">{$transformed5}</error>
  }

let $transformed6 as element() := 
  try {
    $doc2 transform with { 
     (delete node ./@base,
      insert node $doc3/@xml:base into .,
      ()
     )
  }  
  } catch * {
    <error code="{$err:code}" desc="{$err:description}" object="doc2">{$doc2}</error>
  }

return (
  ``[transformed1: No @base attribute:]``
  ,$transformed1
  ,``[transformed2: Has @base attribute:]``
  ,$transformed2
  ,``[transformed3: Has @xml:base attribute:]``
  ,$transformed3
  ,``[Transformed 4: Get att from another element ]``
  ,$transformed4
  ,``[Transformed 5: Rename and then add]``
  ,$transformed5
  ,``[Transformed 6: Delete and then add]``
  ,$transformed6
  ,()
)

I get this result using 10.7 beta:

transformed1: No @base attribute:
<root xml:base="/foo/bar.xml"/>
transformed2: Has @base attribute:
<root xml:base="/foo/bar.xml" base="base attribute"/>
transformed3: Has @xml:base attribute:
<error code="err:XUDY0021" desc="Duplicate attribute name: base." object="doc3"><root xml:base="/foo/bar.xml"/></error>
Transformed 4: Get att from another element 
<root xml:base="/foo/bar.xml" base="base attribute"/>
Transformed 5: Rename and then add
<error code="err:XUDY0021" desc="Duplicate attribute name: base." object="transformed5"><root xml:base="/foo/bar.xml" xbase="base attribute"/></error>
Transformed 6: Delete and then add
<root xml:base="/foo/bar.xml"/>

The case of adding @xml:base to an element that has @base is fixed (transformed2, transformed6) but still getting some failures (transformed3, transformed5).

ChristianGruen commented 1 year ago

Takes more time to fix than expected, sorry. The current implementation creates a duplicate xml:base namespace for…

<x xml:base='a'/> update {
  insert node attribute xml:base { 'b' } into .  
}
ChristianGruen commented 1 year ago

Glad to see this fixed; thanks for your patience.