- From: Norm Tovey-Walsh <ndw@nwalsh.com>
- Date: Wed, 26 Feb 2025 08:46:19 +0000
- To: xproc-dev@w3.org
Hello,
I think I’ve worked out what’s going wrong and a simple fix. There are still some interesting wrinkles though.
Given this document and @select="//c:directory/c:directory":
<c:directory xmlns:c="http://www.w3.org/ns/xproc-step"
xml:base="file:/tmp/y/"
name="y">
<c:file xml:base="file" name="file"/>
<c:directory xml:base="z/" name="z">
<c:file xml:base="file" name="file"/>
</c:directory>
</c:directory>
My implementation uses the select expression to locate the relevant nodes. This one:
<c:directory xml:base="z/" name="z">
<c:file xml:base="file" name="file"/>
</c:directory>
And then it constructs a document containing that node. It constructs an XML document. What’s the base URI of *that* document?
Well, the wrong answer is, the same as its root element. Because that gives you a document with the base URI “file:/tmp/y/z/” that has a root element with an xml:base attribute of “z/” and bad happens.
(If the root element doesn’t have an xml:base attribute, surely the 99% case in general, or it has an xml:base that’s an absolute URI, no problem arises.)
One way to resolve this would be to remove the xml:base attribute from the root element in this case. If we’d said that from the beginning of XProc 1.0, then users would just be living with it. But I think saying it now would be pretty hostile.
The only other option (that I can think of) is to change the base URI of the *document* so that when the xml:base attribute is applied, the right thing happens.
I spent a few minutes pondering all of the complexity involved in taking an absolute URI and a relative xml:base and working out how to manipulate the absolute URI so that it was what you’d need to start with to get back the original when you applied the xml:base. The simple case, and you always get the simple case from p:directory-list, is easy. But users can put arbitrary values in xml:base attributes.
What do you do to “file:/tmp/y/z/” to make it the “before URI” if the xml:base attribute is “./spoon/../../x/y/test/”?
And then it occurred to me that the base URI of the element’s *parent* is *necessarily* the right value. The actual base URI of the element in question was literally constructed by applying its xml:base attribute value to the parent’s base URI.
We’re left with the wrinkle that the base URI of the *XML document* is going to be different (is going to be the base URI of the selected element’s parent) from the base URI of the document element in this case.
I can imagine that might be a little surprising, but I think it’s justified in order to avoid producing utterly the wrong base URI on the document element.
I’ve constructed a few tests and I’ve just thought of one more that I should write.
Be seeing you,
norm
--
Norm Tovey-Walsh <ndw@nwalsh.com>
https://norm.tovey-walsh.com/
> To see the world in a grain of sand,/And a heaven in a wildflower,/Hold infinity in the palm of your hand/and eternity for an hour.--William Blake
Received on Wednesday, 26 February 2025 08:46:27 UTC