DAP4 Dataset Services Response: Difference between revisions

From OPeNDAP Documentation
⧼opendap2-jumptonavigation⧽
Line 254: Line 254:




[[User:Ndp|ndp]] 13:19, 5 July 2012 (PDT)
=== Question [[User:Ndp|ndp]] 13:21, 5 July 2012 (PDT) ===
;Question
: Is it a reasonable thing to use MIME types as ethan suggested (application/vnd.opendap.org.dap4.data etc.)  when describing services in Dataset Services Response, and then, when the server provides a response over HTTP it sets the content header to the lowest common mime type?


:For example in the Dataset Services response we might describe the Dataset Metadata service like this:
Is it a reasonable thing to use MIME types as ethan suggested (application/vnd.opendap.org.dap4.data etc.)  when describing services in Dataset Services Response, and then, when the server provides a response over HTTP it sets the content header to the lowest common mime type?
 
For example in the Dataset Services response we might describe the Dataset Metadata service like this:
<font size="2">
<font size="2">
<source lang="xml" >
<source lang="xml" >
    <Service title="Dataset">
<Service title="Dataset">
        <link type="application/vnd.opendap.org.dap4.ddx+xml"  
    <link type="application/vnd.opendap.org.dap4.ddx+xml"  
            xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp"  
          xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp"  
            xlink:role="http://services.opendap.org/dap4/dataset#">
          xlink:role="http://services.opendap.org/dap4/dataset#" />
    </Service>
</Service>
</source>
</source>
</font>
</font>
: Yet, when a DAP4 server responds to a client asking for http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp the server would set the HTTP headers like so:


Yet, when a DAP4 server responds to a client asking for http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp the server would set the HTTP headers like so:
<font size="2">
<font size="2">
<source lang="txt" >
<source lang="txt" >

Revision as of 20:21, 5 July 2012


<-- back to OPULS Development

Author: ndp

Background

DAP2, while successful within several arenas in the scientific community, failed to live up to some the basic tenants of the world wide web. On of theses weaknesses was it's lack of RESTful interfaces.

Problem addressed

Currently DAP servers provide a number of dataset level responses (services). These include DAP services such as the DDS, DAS, and DDX, plus other services that have been added over time such as the RDF and ISO responses. There is currently no way for a user (or software agent) to discover which of these many services might be available for a particular dataset. While THREDDS catalogs do provide a mechanism for determining which services are associated with which datasets, they don't actually provide a mechanism for discovering the details of the various service URLs. A THREDDS catalog might identify a DAP service, but the URL that can be assembled from the THREDDS catalog for that service is limited to just the base dataset URL. Typically dereferencing this URL will provide one of two things - either the underlying data file (for example a netcdf file) or an HTTP 403 error if direct access to the underlying files has been disabled in the server configuration.

Example:

This URL points to a dataset on a DAP server:

http://test.opendap.org:8080/opendap/data/nc/fnoc1.nc

Dereferencing the link will not connect you to a DAP service or DAP response. It will only return the underlying netcdf file. The only way to know that DAP services exist for this is by reading the URL path and recognizing that it is likely an instance of a DAP server based on the position of the 'opendap' string in the URL.

There is no guarantee that dereferencing this URL will even yield the underlying file, as that behavior is a configuration option for the server. If that access is not allowed in the configuration, then dereferencing the URL will simply return an HTTP 403 (forbidden) error.

Proposed solution

We intend to provide a 'Services' or 'Capabilities' response for DAP4. By default, DAP dataset resource URLs should return an XML document describing the DAP services available for the dataset.

At minimum this document MUST provide for each service available for the dataset:

  • A human readable title of the service (DDX, DDS, etc.)
  • One or more links that can be dereferenced to get the various representations of service response for the dataset in question.
  • An unambiguous, unique to the service, xlink:role identifier that serves as a way to clearly identify what each service on the list purports to do.
  • A brief description of the service
  • A link to a complete, human readable, description of the service response and it's semantics

The response should also include:

  • A reference to an XSLT that a browser would use to render the description into HTML for a presentation view.
  • Descriptions and syntax of server side functions available for the dataset


DAP4 Web Services

A DAP4 web service is described by:

  • A simple human readable name called 'title'.
  • One or more access URLs and each with an associated media-type for the representation returned by that URL.
  • A unique "namespace" like id that is used to define an xlink:role attribute. This is intended to allow people and software to unambiguously identify specific services, irrespective of their human readable title. The idea is that that the xlink:role tells you what is going to happen when you go to xlink:href.
  • An optional description.

A service is accessed by dereferencing its access URL, which is typically constructed by adding some type of suffix to the dataset's referent (aka base) URL. The way in which the query string (aka constraint expression) is used is defined by each service, and there is no requirement for inter-service query string API conformity.

A more extensive discussion of the various services that might appear in a DatasetServices document can be found on the DAP4 Web Services v3 page.

Jimg 22:49, 2 July 2012 (PDT) In this example, I think we should modify it so that the link element follows HTML's (and ATOM's) form (http://tools.ietf.org/html/rfc4287, http://www.atomenabled.org/developers/syndication/) where href is the attribute for the hyperlink reference, type is as it's shown here and rel can be used for stuff like enclosure to indicate something. I think xlink::role is right on the money for describing how the thing referenced by the link should be used. Note that if Service becomes entry and Description becomes title and we add id and updated to entry/Service we have a valid ATOM entry element. Then we can start thinking of these responses as both things that describe a resource and can be used as part of a data cast feed.

It might look like:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="/opendap/xsl/serviceDescription.xsl"?>
<DatasetServices 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xml:base="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml">
    
    <entry title="Data Request Form" >
        <id>http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.html</id>
        <updated>2003-12-13T18:30:02-05:00</updated>
        <link type="text/xml"  href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.html" 
             xlink:role="http://services.opendap.org/dap4/data-request-form#">
        <title>OPeNDAP HTML Data Request Form for data sub-setting and access.</title>
    </entry>

...

</DatasetServices>

A trivial change, but then we can reuse these in an ATOM feed.

One thing, the id element of entry is tricky although I think the URL works.

Example Response

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="/opendap/xsl/serviceDescription.xsl"?>
<DatasetServices 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xml:base="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml">
    
    <Service title="Data Request Form" >
        <link type="text/xml" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.html" 
             xlink:role="http://services.opendap.org/dap4/data-request-form#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_HTML_DATA_Request_Form_Service">OPeNDAP HTML Data Request Form for data sub-setting and access.</Description>
    </Service>

    <Service title="Dataset">
        <link type="text/xml" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp" 
             xlink:role="http://services.opendap.org/dap4/dataset#">
        <link type="application/json" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp.json" 
             xlink:role="http://services.opendap.org/dap4/dataset#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_Dataset_Service_-_The_metadata">DAP4 Dataset Description and Attribute XML Document.</Description>
    </Service>

    <Service title="DAP4 Data">
        <link type="multipart/mixed" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.dap" 
             xlink:role="http://services.opendap.org/dap4/data#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_Data_Service">DAP4 Data object.</Description>
    </Service>

    <Service title="DAP2 Data">
        <link type="application/octet-stream" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.dods"
             xlink:role="http://services.opendap.org/dap2/dods#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP2:_Data_Service">DAP2 Data Object.</Description>
    </Service>

    <Service title="ASCII Data">
        <link type="text/plain" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.asc"
             xlink:role="http://services.opendap.org/dap4/ascii#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_ASCII_Data_Service">The DAP4 Data response in ASCII form.</Description>
    </Service>

    <Service title="NetCDF-File">
        <link type="application/x-netcdf" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.nc"
             xlink:role="http://services.opendap.org/dap4/netcdf-3#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_NetCDF_File-out_Service">NetCDF file-out response.</Description>
    </Service>

    <Service title="XML Data Response">
         <link type="text/xml" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdap"
             xlink:role="http://services.opendap.org/dap4/xml-data#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_XML_Data_Service">An XML document containing both the dataset's structural metadata along with data values.</Description>
    </Service>

    <Service title="DDX">
        <link type="text/xml" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.ddx"
             xlink:role="http://services.opendap.org/dap2/ddx#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP2:_DDX_Service">OPeNDAP Data Description and Attribute XML Document.</Description>
    </Service>

    <Service title="DDS">
        <link type="text/plain" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.dds"
             xlink:role="http://services.opendap.org/dap2/dds#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP2:_DDS_Service">OPeNDAP Data Description Structure.</Description>
    </Service>

    <Service title="DAS"
        <link type="text/plain" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.das"
             xlink:role="http://services.opendap.org/dap2/das#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP2:_DAS_Service">OPeNDAP Dataset Attribute Structure.</Description>
    </Service>

    <Service title="RDF">
        <link type="application/rdf+xml" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.rdf"
             xlink:role="http://services.opendap.org/dap4/rdf#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_RDF_Service">An RDF representation of the Dataset response (DDX) document.</Description>
    </Service>

    <Service title="INFO">
        <link type="text/html" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.info"
             xlink:role="http://services.opendap.org/dap2/info#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP2:_Info_Service">OPeNDAP Dataset Information Page.</Description>
    </Service>

    <Service title="Server Version">
        <link type="text/xml" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.ver"
             xlink:role="http://services.opendap.org/dap4/version#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_Server_Version_Service">An XML document containing information about the software version of the server..</Description>
    </Service>

    <Service title="ISO-19115">
        <link type="text/xml" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.iso"
             xlink:role="http://services.opendap.org/dap4/iso-19115-metadata#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_ISO_19115_Service">ISO 19115 Metadata Representation of the Dataset (DDX) response.</Description>
    </Service>

    <Service title="ISO-19115-Score">
        <link type="text/html" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.rubric"
             xlink:role="http://services.opendap.org/dap4/iso-19115-score#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_ISO_Conformance_Score_Service">ISO 19115 Metadata Representation conformance score for this dataset.</Description>
    </Service>

    <Service title="File Access"
        <link type="text/xml"  ## This value depends on the file being accessed.
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.file"
             xlink:role="http://services.opendap.org/dap4/file#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_Native_File_Access_Service">Access to dataset file.</Description>
    </Service>

    <Service title="Dataset Services Description">
        <link type="text/xml" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml" 
             xlink:role="http://services.opendap.org/dap4/dataset#">
        <link type="application/json" 
             xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.json" 
             xlink:role="http://services.opendap.org/dap4/dataset#">
        <Description xlink:href="http://docs.opendap.org/index.php/DAP4_Web_Services#DAP4:_Dataset_Services_Description_Service">An XML document itemizing the Services available for this dataset.</Description>
    </Service>

    <ServerSideFunctions>
        <Function name="geogrid"
          xlink:href="http://docs.opendap.org/index.php/Server_Side_Processing_Functions#geogrid">
            <Description>Allows a DAP Grid variable to be sub-sampled using georeferenced values.</Description>
        </Function>
        <Function name="grid"
          xlink:href="http://docs.opendap.org/index.php/Server_Side_Processing_Functions#grid">
            <Description>Allows a DAP Grid variable to be sub-sampled using the values of the coordinate axes.</Description>
        </Function>
        <Function name="linear_scale"
          xlink:href="http://docs.opendap.org/index.php/Server_Side_Processing_Functions#linear_scale">
            <Description>Applies a linear scale transform to the named variable.</Description>
        </Function>
        <Function name="version"
          xlink:href="http://docs.opendap.org/index.php/Server_Side_Processing_Functions#version">
            <Description>Returns version information for each server side function.</Description>
        </Function>
    </ServerSideFunctions>
</DatasetServices>


I also put together a simple XSLT to make this a human friendly HTML. I added a reference to it in the XML document. When you point a browser at the resource URL (For example http://localhost:8080/opendap/data/nc/fnoc1.nc ) the Service Description response is returned as an XML file (above), the browser detects the xml-stylesheet reference, grabs the XSLT, uses it to convert the XML to HTML and renders it like this:

ServiceDescriptionPrototype-01.png

Rationale for the solution

The solution provides DAP4 servers with RESTful interface that allows for both server-driven and agent driven content negotiation as described in [section 12 of the HTTP 1.1 specification]. Providing the DatasetServices response in XML allows many down stream applications to ingest the content and leaves open the option for server implementers to add XSLT references to the document so that clients like browsers can easily build a presentation view of the information.

Discussion

Question ndp 13:21, 5 July 2012 (PDT)

Is it a reasonable thing to use MIME types as ethan suggested (application/vnd.opendap.org.dap4.data etc.) when describing services in Dataset Services Response, and then, when the server provides a response over HTTP it sets the content header to the lowest common mime type?

For example in the Dataset Services response we might describe the Dataset Metadata service like this:

<Service title="Dataset">
    <link type="application/vnd.opendap.org.dap4.ddx+xml" 
          xlink:href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp" 
          xlink:role="http://services.opendap.org/dap4/dataset#" />
</Service>

Yet, when a DAP4 server responds to a client asking for http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp the server would set the HTTP headers like so:

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Content-Type: test/xml"
Content-Description: application/vnd.opendap.org.dap4.ddx+xml; url=http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp
Content-Encoding: gzip
XDAP: 4.0

What do people think about that? I think doing it this way allows us to communicate semantic information about service URL's in a way that works in our own documents and in things like Atom, which a the same time it allows the servers to produce responses that will be consumable by a broader range of clients. My fear here is that this will break (or maybe just irritate) sophisticated clients. Or maybe not... That's what I am asking about this.

Atom - How might we express this response as an Atom 1.0 document.

Here are two examples in which I attempted to take all of the semantics from the previous proprietary example and represent them in an Atom document.

Both of these documents validated using the W3C Feed Validation Service.

All of the content components of each document are required with the exception of the atom:link/@title attribute, which is optional.


Example: Validated Atom Document for a dataset, each service as an atom:entry

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
        <title>Example Feed</title>
        <subtitle>A subtitle.</subtitle>
        <link href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml" title="DatasetServices: ECMWF_ERA-40_subset.ncml" rel="self" />
        <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>
        <updated>2003-12-13T18:30:02Z</updated>
        
            

    <entry xmlns="http://www.w3.org/2005/Atom">
        <id>http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml</id>
        <title>DAP Dataset Services Response.</title>
        <updated>2003-12-13T18:30:02Z</updated>
        <author>
            <name>Nathan Potter</name>
            <email>johndoe@devnull.com</email>
        </author>
        
        <content type="xhtml" xml:lang="en" xml:base="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml">
            <div xmlns="http://www.w3.org/1999/xhtml">DAP4 Dataset Metadata Service for http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml</div>
        </content>

        <link rel="self"
              title="Dataset Services" 
              type="application/atom+xml" 
              href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml"/>
    </entry>

    <entry>
        <id>http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp</id>
        <title>DAP4 Dataset Description and metadata Attributes XML Document.</title>
        <updated>2003-12-13T18:30:02Z</updated>
        <author>
            <name>Nathan Potter</name>
            <email>johndoe@devnull.com</email>
        </author>
        
        <content type="xhtml" xml:lang="en" xml:base="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml">
            <div xmlns="http://www.w3.org/1999/xhtml">DAP4 Dataset Metadata Service for http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml</div>
        </content>

        <link rel="related"
              title="Dataset Metadata" 
              type="application/vnd.opendap.org.dap4.ddx+xml" 
              href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdp"/>
    </entry>

    <entry>
        <id>http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.dap</id>
        <title>DAP4 Data object.</title>
        <updated>2003-12-13T18:30:02Z</updated>
        <author>
            <name>Nathan Potter</name>
            <email>johndoe@devnull.com</email>
        </author>
        
        <content type="xhtml" xml:lang="en" xml:base="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml">
            <div xmlns="http://www.w3.org/1999/xhtml">DAP4 Data Service for http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml</div>
        </content>
        
        <link rel="related"
              title="DAP4 Data" 
              type="application/vnd.opendap.org.dap4.data" 
              href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.dap"/>
    </entry>

    <entry>
    
        <id>http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.html</id>
        <title>OPeNDAP HTML Data Request Form for data sub-setting and access.</title>
        <updated>2003-12-13T18:30:02Z</updated>
        
        <author>
            <name>Nathan Potter</name>
            <email>johndoe@devnull.com</email>
        </author>
        
        <content type="xhtml" xml:lang="en" xml:base="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml">
            <div xmlns="http://www.w3.org/1999/xhtml">HTML Data Request Form http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml</div>
        </content>
        

        <link rel="related"
              title="Data Request Form" 
              type="text/xml"  
              href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.html"/>
              
    </entry>

        .
        .
        .
    
</feed>

Example: Validated Atom Document with one atom:entry for a dataset, and an atom:link for each service

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entry xmlns="http://www.w3.org/2005/Atom">

    <title>DAP Dataset Services: ECMWF_ERA-40_subset.ncml</title>

    <id>http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml</id>

    <updated>2003-12-13T18:30:02-05:00</updated>
    
    <author>
        <name>Nathan Potter</name>
        <email>johndoe@devnull.com</email>
    </author>
    <summary>DAP Dataset Services for http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml</summary>
    
    <link title="Dataset Services Description"
          rel="self"
          type="application/atom+xml" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml"/>
    
    <link title="DAP4 Dataset Metadata XML Document."
          rel="alternate"
          type="application/vnd.opendap.org.dap4.ddx+xml" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xml"/>
    
    <link title="DAP4 Data object."
          rel="related"
          type="application/vnd.opendap.org.dap4.data" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.dap"/>

    <link title="OPeNDAP HTML Data Request Form for data sub-setting and access."
          rel="related"
          type="text/html" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.html" />

    <link title="DAP2 Data Object."
          rel="related"
          type="application/vnd.opendap.org.dap2.data" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.dods"/>
          
    <link title="DAP4 Data response in ASCII form."
          rel="related"
          type="text/plain" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.asc"/>
          
    <link title="NetCDF-3 file-out response."
          rel="related"
          type="application/x-netcdf" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.nc"/>
          
    <link title="XML Data Response"
          rel="related"
          type="application/vnd.opendap.org.dap4.data+xml" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.xdap"/>
          
    <link title="DAP2 DDX document"
          rel="related"
          type="application/vnd.opendap.org.dap2.ddx+xml" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.ddx"/>
          
    <link title="DAP2 DDS document"
          rel="related"
          type="application/vnd.opendap.org.dap2.dds" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.dds"/>
          
    <link title="DAP2 DAS document"
          rel="related"
          type="application/vnd.opendap.org.dap2.dds" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.das"/>
          
    <link title="RDF representation of the Dataset Metadata response."
          rel="related"
          type="application/rdf+xml" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.rdf"/>
          
    <link title="DAP2 Dataset Information Page"
          rel="related"
          type="text/html" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.info"/>
          
    <link title="Server Version Document"
          rel="related"
          type="text/xml" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.ver"/>
          
    <link title="ISO 19115 Metadata Representation of the Dataset (DDX) response."
          rel="related"
          type="text/xml" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.iso"/>
          
    <link title="ISO 19115 Metadata Representation conformance score for this dataset."
          rel="related"
          type="text/html" 
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.rubric"/>
          
    <link title="Dataset file access"
          rel="related"
          type="text/xml"  
          href="http://test.opendap.org:8090/opendap/hyrax/ECMWF_ERA-40_subset.ncml.file"/>
          
</entry>