- From: Jeremy Carroll <jjc@hpl.hp.com>
- Date: Tue, 17 Apr 2007 14:04:05 +0100
- To: Fabien Gandon <Fabien.Gandon@sophia.inria.fr>
- CC: ogbujic@ccf.org, GRDDL Working Group <public-grddl-wg@w3.org>
Fabien Gandon wrote:
> The RDFa2RDFXML transformation is in XSLT1.0 and XPath 1.0. Unless I
> missed something in the specs (which could be the case) there is no way
> for me to get the IRI of the source document in this transformation i.e.
> there is no get-base-uri() function available. Thus What I do now is this:
>
> <!--get the base of the current XHTML page -->
> <variable name='base' select="//*/@xml:base[position()=1]"/>
>
> <!-- get the url of the current XHTML page if provided as a parameter to
> the XSLT engine -->
> <param name='url' select=""/>
>
> <!-- set the variable to contain the URL of the source document whether
> it was provided by the base or as a parameter e.g.
> http://example.org/bla/file.html-->
> <variable name='this' >
> <choose>
> <when test="string-length($base)>0"><value-of
> select="$base"/></when>
> <otherwise><value-of select="$url"/></otherwise>
> </choose>
> </variable>
>
> Is there a better way to get and use the source IRI in a transformation?
> Also, it seemed to me, reading your message, that the base may change
> for different nodes in the same document. Is that right? Is it only for
> external entities or can several xml:base be specified in the document?
In an XML document, using XSLT 1.0, the way to get the base for any
element is to match against self-or-ancestor to the closest xml:base.
You sort of need to cross your fingers and hope that this base is an
absolute URI rather than a relative reference. Without doing URI
processing, it is very hard to flatten the following XML in XSLT 1.0 and
get the xml:base right
<a xml:base="http://example.org/">
<b xml:base="b/">
<a xml:base="a/">
<a xml:base="a/">
<b xml:base="b/">
<a href="foo"/>
</b>
</a>
</a>
</b>
</a>
If the foo is a relative reference then I think it is
http://example.org/b/a/a/b/foo
I think there might be some W3C maintained code that does not URI
processing in XSLT 1.0. Using XSLT 2.0 is, IMO, a better solution.
===
However, the base-param issues are not to do with XSLT usage, but to do
with GRDDL processing. A GRDDL processor, processes some documents,
invokes some transforms, and processes some transform output.
Either of the processing steps use base-params - but which URIs get
passed? Do we respect xml:base attributes or not? Which HTTP or other
protocol level indicators of base do we respect? Do we respect html
<base> elements within valid HTML?
Do either library functions:
embeddedRDF
and
glean-profile
respect xml:base and/or html base?
Jeremy
>
> Cheers,
>
--
Hewlett-Packard Limited
registered Office: Cain Road, Bracknell, Berks RG12 1HN
Registered No: 690597 England
Received on Tuesday, 17 April 2007 13:04:32 UTC