[xquery-talk] XQuery 3 try/catch and duplicate attributes
David Sewell
dsewell at virginia.edu
Thu Dec 19 10:21:08 PST 2013
I'm trying to clean up some old code of ours that is throwing server errors when
fed buggy data. To simplify greatly, the code is something like this:
let $element := <el att1="one" att2="two">text</el>
return element new {
$element/attribute(),
attribute id { "new-id" },
$element/node()
}
where the content of $element comes from XML data where <el> is not supposed to
carry an @id attribute. Of course if the data is buggy and $element has a child
@id, the above code throws a dynamic error (XQDY0025, duplicate attribute
names).
I naively thought this might be a quick fix to prevent runtime errors:
xquery version "3.0";
let $element := <el att1="one" att2="two" id="old-id">text</el>
return element new {
$element/attribute(),
try {attribute id { "new-id" }} catch * {()},
$element/node()
}
but it doesn't trap the error (in any XQuery 3 processor I've checked). The
try/catch will work only if put around the entire element constructor.
Can someone who understands the 3.0 spec better than I do explain the general
principle behind this? Is it that the processor cannot be expected to evaluate
the legality of the constructed element until all its parts have been assembled?
David
--
David Sewell, Editorial and Technical Manager
ROTUNDA, The University of Virginia Press
PO Box 400314, Charlottesville, VA 22904-4314 USA
Email: dsewell at virginia.edu Tel: +1 434 924 9973
Web: http://rotunda.upress.virginia.edu/
More information about the talk
mailing list