RDF Site Summary 1.0 Modules: Link

Authors

Kevin A. Burton , Independent

Version

Latest Version: http://purl.org/rss/1.0/modules/link/

Mon Jul 22 2002 06:15 PM ( init ) kab

Thu Aug 27 2002 08:00 PM ( added description of functionality. ) kab

Thu Aug 27 2002 08:00 PM ( migrated relationships to URIs ) kab

Thu Sep 13 2002 01:00 PM ( added better description of 'source' relationships ) kab

Thu Oct 15 2002 01:00 PM ( better documentation of ad hoc link relationships for new RSS modules and additional formats. ) kab

Status

Proposed, Mon Jul 22 2002 06:28 PM

Rights

Copyright © 2000 by the Authors.

Permission to use, copy, modify and distribute the RDF Site Summary 1.0 Link Module Specification and its accompanying documentation for any purpose and without fee is hereby granted in perpetuity, provided that the above copyright notice and this paragraph appear in all copies. The copyright holders make no representation about the suitability of the specification for any purpose. It is provided "as is" without expressed or implied warranty.

This copyright applies to the RDF Site Summary 1.0 Link Module Specification and accompanying documentation and does not extend to the RSS Module's format itself.

Description

The mod_link module supports the syndication of site link information along with RSS 1.0 XML feeds. The W3C HTML link mechanism provides the original inspiration for this module.

Link information can be used to:

In addition links can be used to provide functionality that would not normally be available if RDF/XML were included inline with the original RSS.

Enables integration of multiple RSS applications

RSS applications generally fall into one of three categories; aggregators, readers, and producers. These generally deal with different use cases when handling RSS. An RSS producer (such as Moveable Type) could export RSS and link to the mod_subscription RDF created from an RSS reader. This allows each application to handle what they do best.

It is recommended that RSS producers enable a mechanism for the user to define links with new relationships so that 3rd party applications and services be integrated into the users RSS feed.

Reduces amount of data required of RSS feeds.

As more modules are developed for RSS the file size of .rss files will grow in proportion. One example is the use of mod_content within existing RSS files. While it is nice to have the content of item within the RSS the file becomes bloated for downlevel user-agents who are unable to use mod_content.

Instead of including the RDF/XML inline the developer can produce RDF for mod_link aware applications. For example the user can define a link with a 'mod_content' relationship which points to an RDF file which includes the content.

Links are implemented as directional edges from the current RSS channel to an external resource. Link relationships are provided so that applications can determine how the given link should be handled.

Relationships

The following link relationships are defined by this specification.

print - http://purl.org/rss/1.0/modules/proposed/link/#print
Printable version of the current RSS item. For HTML documents this will be a URL without navigation items and other options which can cloud the document when sent to a printer. Print links provide rdf:resource attributes which do not have extra content and have been explicitly formated for a printer.
permalink - http://purl.org/rss/1.0/modules/proposed/link/#permalink
Permalink version of the current RSS item. A permalink is defined as a URL for a resource that is always available (similar to a PURL). Some weblogs cycle through articles and a URL may become invalid after a period of time. Permalinks provide a link that is always available to and should be provided within RSS so that clients can use this instead of a temporary link.
service - http://purl.org/rss/1.0/modules/proposed/link/#service
Link to a service or service description (WSDL) file. This can be used for runtime discovery of Web Services within an RSS file.
source - http://purl.org/rss/1.0/modules/proposed/link/#source
Include source linkage with this RSS item. This can be used for proper attribution of the original version of this RSS item. RSS 0.92 supports a <source> element with mod_link supporting the same concept via the source relationship.
RSS aggregators may also choose to use the source URL to specify the resource which was used within an aggregation. This can be used with a URL that was fetched from a cache (possibly locally) or as the result of another URL yet still maintaining the link to the original source.
topic - http://purl.org/rss/1.0/modules/proposed/link/#topic
Provide a link to the current RSS channel or item by topic. This is generally an HTML or RSS file which contains RSS items on the same topic as the current item.
alternate - http://purl.org/rss/1.0/modules/proposed/link/#alternate
Provide alternate language, topic, (etc) version of an item or channel.

Creation of New Links

Vendor specific and additional links can also be defined (as new relationships) ideally being incorporated back into this specification. New relationship are created by using unique URIs for the l:rel attribute value. This can be used with the SRDF spec to enable creation of new RSS modules and define new relationships which point to external resources.

The following URI format should be used:

foo - http://example.org/rss/1.0/modules/proposed/foo/
Provide foo linkage from the new example.org RSS module.

The relation l:rel should be a URL which documents the format and how the link element is used. It is also recommended that documentation is provided which includes syntax and a required/optional attribute table.

Differences from HTML 4.x link mechanism

No media attribute.
The HTML link specification reads: "HTML allows authors to design documents that take advantage of the characteristics of the media where the document is to be rendered (e.g., graphical displays, television screens, handheld devices, speech-based browsers, braille-based tactile devices, etc.). By specifying the media attribute, authors allow user agents to load and apply style sheets selectively." This does not seem appropriate for use within RSS and is not included.
No reverse links.
It was not obvious why RSS needed reverse links. This may be provided in a future version of this spec if deemed necessary.
No href attribute.
The rdf:resource is used instead.

Namespace Declarations

Syntax

l:link

l:link is a sub-element of the RSS <channel> or <item> element. Note that it may be used with modules but support needs to be explicitly provided for this.

l:link supports the following attributes:

rdf:resource
Provides the URL for the target of this link. The URL given must be absolute, we do not support relative paths. This is due to the presence of caching software which might not be mod_link aware. If the URL given was relative it may break when the cached resource is given to a calling application. Note that mod_link aware caching engines are also encouraged to consider caching the content represented by the target resource.
l:type
This attribute gives an advisory hint as to the content type of the content available at the link target address. It allows user agents to opt to use a fallback mechanism rather than fetch the content if they are advised that they will get content in a content type they do not support. This also supports any namspace (URI) if a media type for the destination resource has not yet been registered.
l:title
A human readable title for this link. Most cases this will be human readable but for services this might could be a urn for the service ID.
l:rel
Specify the document relationship. See document relationships
l:lang
Language code for media on specific target. This attribute specifies the base language of the resource designated by rdf:resource.
l:charset
This attribute specifies the character encoding of the resource designated by the link. Please consult the section on character encodings for more details.

While most attributes are optional, based on the relationship they may become required:

print permalink service source alternate topic
within item yes yes no yes yes yes
within channel no no yes no yes yes
maximum unbounded * unbounded ** unbounded *** 1 per l:type unbounded **** 1 per l:type
rdf:resource required required required required required required
l:rel required required required required required required
l:type required optional required optional required required
l:title optional optional optional optional optional required
l:lang optional optional optional optional optional optional
l:charset optional optional optional optional optional optional

* specify different content type and title)
** only one permalink per l:type attribute
*** Each service should have separate l:title and l:type attributes
**** Specify l:type and or l:lang attributes

The l:link element is used as follows:



<!-- provide an alternative link for a french RSS file -->
<l:link l:rel="http://purl.org/rss/1.0/modules/link/#alternate"
        l:type="application/rss+xml"
        l:title="French"
        l:lang="fr"
        rdf:resource="http://www.peerfear.org/rss/index-fr.rss"/>

Examples

This is an example of an RSS channel publishing two subscription channels.


<?xml version="1.0" encoding="utf-8"?> 

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xmlns:l="http://purl.org/rss/1.0/modules/link/"
         xmlns="http://purl.org/rss/1.0/"> 

    <channel rdf:about="http://example.org/rss.rdf">
        <title>Example Feed</title>
        <link>http://www.example.org</link>
        <description>Simply for the purpose of demonstration.</description>
        
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="http://example.org/item/"/>
            </rdf:Seq>
        </items>

        <!-- link to the french version of this website -->
        <l:link l:rel="http://purl.org/rss/1.0/modules/link/#alternate"
                l:type="application/rss+xml"
                l:title="French"
                l:lang="fr"
                rdf:resource="http://www.example.org/index-fr.rss"/>

        <!-- alternative RSS channels (dc:subject specific) -->

        <l:link l:rel="http://purl.org/rss/1.0/modules/link/#topic"
                l:type="application/rss+xml"
                l:title="Linux"
                l:lang="en"
                rdf:resource="http://www.peerfear.org/rss/index-linux.rss"/>

        <!-- support WSDL service discovery for this channel -->

        <l:link l:rel="http://purl.org/rss/1.0/modules/link/#service"
                l:type="http://schemas.xmlsoap.org/wsdl/"
                l:title="urn:reptile-search"
                l:lang="en"
                rdf:resource="http://www.peerfear.org/reptile/search/search.wsdl"/>

        <!-- linkage to additional RDF about this channel. -->

        <l:link l:rel="http://purl.org/rss/1.0/modules/proposed/subscription/"
                l:type="application/rdf+xml"
                l:title="Subscriptions"
                rdf:resource="http://www.peerfear.org/subscriptions.rdf"/>

    </channel>
    
    <item rdf:about="http://example.org/item/">
        <title>The Example Item</title> 
        <link>http://example.org/item/</link>

        <!-- permalink version of this item -->
        <l:link l:rel="http://purl.org/rss/1.0/modules/link/#permalink"
                l:type="text/html"
                rdf:resource="http://example.org/item/permalink"/>

        <!-- link to the french version of this website -->
        <l:link l:rel="http://purl.org/rss/1.0/modules/link/#alternate"
                l:type="text/html"
                l:title="French"
                l:lang="fr"
                rdf:resource="http://www.example.org/index-fr"/>

        <!-- link to the source used to inspire this link -->
        <l:link l:rel="http://purl.org/rss/1.0/modules/link/#source"
                l:type="text/html"
                l:title="Example source link"
                rdf:resource="http://www.cnn.com/2002/TECH/science/example"/>

        <!-- link to the RSS version of this topic -->
        <l:link l:rel="http://purl.org/rss/1.0/modules/link/#topic"
                l:type="application/rss+xml"
                l:title="Example"
                l:lang="en"
                rdf:resource="http://www.peerfear.org/rss/index-example.rss"/>

        <!-- link to the HTML version of this topic -->
        <l:link l:rel="http://purl.org/rss/1.0/modules/link/#topic"
                l:type="text/html"
                l:title="Example"
                l:lang="en"
                rdf:resource="http://www.peerfear.org/rss/index-example.html"/>

    </item> 
    
</rdf:RDF>

When rendered as a RDF graph the semantic relationship looks like: