[xquery-talk] Setting the document URI on constructed nodes.
G. Ken Holman
gkholman at CraneSoftwrights.com
Sun May 13 09:26:34 PDT 2012
At 2012-05-13 10:19 -0400, I wrote:
>I cannot think of any way in the spec to specify the document URI of
>a temporary in-memory tree, because I don't think that is meaningful
>in the general case.
>
>However, when I've chained transformations in the past, I've
>sometimes needed to preserve the input document URI along all of the
>steps (because there have been relative URI addresses in the data)
>and so I've very simply used xml:base= on the document element of
>the temporary tree (unless the document element already has an
>xml:base= attribute).
>
>Remember that from a syntax perspective, the root document file
>entity of an XML document must contain the document element, so
>base-uri(/*) is always the same as document-uri(root()) when there
>is no xml:base= already there on the document element.
>
>So, when I create a temporary tree I use:
>
> <root xml:base="...whatever..."/>
>
>... and when I ask for base-uri(/*) I get "...whatever...".
>
>In my work I would do something along the lines of:
>
>let $d := doc("input.xml") return
>element {$d/name(.)}
> {
> attribute xml:base { "...whatever..." },
> $d/@xml:base, (:in case there already exists one:)
> "rest of the processing"
> }
Actually, two mistakes in throwing together that example. I was
asking for the name of the root node (not the document element) and I
wouldn't hard-code the xml:base value. Rather I'd use the
document-uri() function to preserve the URI of the input file, or
even shorten it further by using base-uri() on the document element
so as to accommodate any existing xml:base= attribute:
let $d := doc("input.xml") return
element {$d/*/name(.)}
{
attribute xml:base { base-uri($d/*) },
"rest of the processing"
}
>I hope this helps.
>
>. . . . . . . . . . . Ken
>
>At 2012-05-13 13:58 +0000, David Lee wrote:
>>I noticed somewhat of a hole in XQuery ... hoping I am wrong.
>>I can find no way to set the base URI of a constructed document e.g
>>
>>document { <root/> }
>>
>>such that fn:document-uri() would return it.
>>
>>It seem this is one of those properties that must come from the
>>outside environment.
>>I know if I were to store the document to a file then re-read it,
>>likely the XML processor would pick it up ... I also know how to do
>>this programmatically in API's like say Saxon.
>>But it seems missing from XQuery itself. My guess is that since
>>XQuery doesnt support storing documents it was thought unimportant
>>to set the document URI.
>>
>>Why I ask ?
>>I'm still looking at Streaming XDM formats, including pure
>>in-memory streaming.
>>But it seems like I cannot directly encode and pass on a document
>>(or base) URI through XQuery by itself to the output. So any
>>constructed documents would have none or undefined URI's to the
>>receiver. this leads me to think I need a meta encoding for XDM
>>much like proposed at Balisage (XDML). basically passing the URI
>>information as seperate XDM values and a convention for
>>interpreting them. This seems like it could not be done in pure
>>XQuery however because the target even if it got say a sequence (
>>"uri" , document ) has no way to apply the uri to the document
>>using XQuery so it must be done by external code.
>>
>>Thanks for any commentary.
>>-David
--
Public XSLT, XSL-FO, UBL and code list classes in Europe -- Oct 2012
Contact us for world-wide XML consulting and instructor-led training
Free 5-hour lecture: http://www.CraneSoftwrights.com/links/udemy.htm
Crane Softwrights Ltd. http://www.CraneSoftwrights.com/q/
G. Ken Holman mailto:gkholman at CraneSoftwrights.com
Google+ profile: https://plus.google.com/116832879756988317389/about
Legal business disclaimers: http://www.CraneSoftwrights.com/legal
More information about the talk
mailing list