To demonstrate XLink a little further, we will look at a typical scenario that would benefit immensely from a more sophisticated linking model, showing how XLink and XPointer might be used.
Jack is undertaking an online correspondence course about XML and linking. The course includes support for richly linked course content, discussion forums, and interactive group work. Jack is completing some work for the course. After logging in to the main site, he goes to the course material for the relevant session on linking concepts. The material provides an initial discussion of some basic concepts and then directs Jack to study a set of readings that have been published elsewhere on the Web (and that predate the course materialhence, the authors of these readings are oblivious to the existence of the course that Jack is taking).
Jack follows the link to the first article and commences reading. While reading the material, he comes across the term transclusion. He clicks on this word, and a window pops up providing Jack with a definition of transclusion provided by his instructor.
Adding Links to Read-Only Material
In this case, the course instructor has added links for definitions to material over which she has no controlmaterial that (as far as the instructor is concerned) is read-only. With conventional HTML pages, links must be embedded into the source material, which, in this case, cannot be modified. As such, the only ways of achieving this using standard Web servers and HTML pages are either to save the pages locally and modify them to include the new links (which is inefficient and has copyright problems), or to extend the server functionality to allow it to obtain other pages, modify them dynamically to add new links, and then deliver the modified pages (effectively, a link-adding proxyagain, rather complex to manage).
This difficulty is a consequence of having to embed links in the source material. A much simpler approach is to define links independently of the source material. A user could specify (or have specified for him) a set of pages to view and the list of links to use with this content (potentially stored completely independently from the content). As a result, authors could add their own links in content over which they have no control. Indeed, different lists of links could be created for different users or different situations. As will be shown later, XLink explicitly supports this type of functionality through third-party links and external linkbases.
Jack reads the definition and then closes the pop-up window. He continues reading, only to come across the phrase "Ted Nelson's definition of transclusion includes the concept of contexts." Again, Jack selects transclusion, but this time a menu pops up providing Jack with the choice of four link destinations. The first choice is the definition, which he has already seen.
This part of the scenario describes a link that had the same link anchor text as the previous example (transclusion). We can create this situation by simply adding a new link anchor (and associated link) for each occurrence of the relevant phrase, but this could become extremely cumbersome and difficult to maintain if the word occurred often.
Generic links solves this problem. By defining a link that has as its source anchor any occurrence of the relevant text, we effectively create a link that is much easier to maintain. Again, this is relatively easy to implement in XML. For example, the following XPointer refers to any occurrence of the text transclusion within element content in a document (though it won't match attribute values and any XML markup such as element or attribute names):
This XPointer can then be used to create a link from all occurrences of this text to the relevant definition of the text in a file containing a list of definitions. For example, the following third-party extended link provides a link from all occurrences of the words transclude, transclusion, and transcluding within the link.xml file to an appropriate definition in the defs.xml file (note that this link can stored in a third file unrelated to either):
<extendedlink xlink:type="extended"> <loc xlink:type="locator" xlink:href="links.xml#xpointer(string-range(//*,'transclude'))" xlink:role="phrase"/> <loc xlink:type="locator" xlink:href="links.xml#xpointer(string-range(//*,'transclusion'))" xlink:role="phrase"/> <loc xlink:type="locator" xlink:href="links.xml#xpointer(string-range(//*,'transcluding'))" xlink:role="phrase"/> <loc xlink:href="defs.xml#xpointer(//defn[phrase='transclude'])" xlink:role="defn"/> <go xlink:type="arc" xlink:from="phrase" xlink:to="defn" xlink:show="new" xlink:actuate="onRequest"/> </extendedlink>
The second destination is to Ted Nelson's definition (in its original source), and the third and fourth destinations relate to two different discussions of the relationship between transclusion and context.
The example described is more complex than just using generic anchors. In this case, Jack is given a choice of four possible destinations. These destinations could be generated from several sources. The first destination given is generated from the fact that the selected word (transclusion) has a generic link to a definition of the phrase (as described above).
The second destination (to Ted Nelson's original definition and discussion of transclusion) might have been generated from an outbound link embedded in the content itself. For example, the source content for the page might have looked something like:
<p id="p23">...so let us consider the issue of context. <simplelink xlink:href="Nelson.htm" xlink:show="new"> Ted Nelson's definition of transclusion</simplelink> includes the concept of contexts. What this means is that...
In this example, the phrase "Ted Nelson's definition of transclusion" is the anchor for a simple link. But the word transclusion within this phrase is also the anchor for a generic link; when it is selected, the user is given the choice of destination to follow.
The situation can become more complex still if we add another third-party link with an anchor that overlaps. For example, we could define the following link (abbreviated for clarity):
<extendedlink xlink:type="extended"> <loc xlink:href="doc0.xml#xpointer(string-range(id('p23'), 'transclusion includes the concept of contexts'))" xlink:role="phrase"/> <loc xlink:href="doc1.xml" xlink:role="discussion"/> <loc xlink:href="doc2.xml" xlink:role="discussion"/> <go xlink:from="phrase" xlink:to="discussion" xlink:show="new" xlink:actuate="onRequest"/> </extendedlink>
This creates a link from the phrase "transclusion includes the concept of contexts" within the specified document to two possible destinations. In other words, we have overlapping anchors. We also have a link that has two possible destinations (which, in this case, the user can choose from). In summary, we have the following:
A generic (external) link that creates an anchor from "Ted Nelson's definition of transclusion includes the concept of contexts" for a link to the instructor's definition of transclusion.
An embedded link that creates an anchor from "Ted Nelson's definition of transclusion includes the concept of contexts" for a link to Ted Nelson's original definition of transclusion.
An external link that creates an anchor from "Ted Nelson's definition of transclusion includes the concept of contexts" for a link to two different discussions of transclusion and context.
When Jack selects the word transclusion, he is given the choice of which of the four possible destinations he wants to view.
Jack finishes reading the article and returns to the main page for the current week's course material. He continues to read several additional articles, including a very recent essay. A few days later, he returns to the course material and navigates to a discussion that compares the articles. The discussion includes fragments from most of the articles.
Transclusion: Supporting Composition
This fragment of the scenario is a true example of transclusion. The document Jack is viewing could be constructed manually, but it makes more sense to build it directly from the original sources. For example, consider the following XML fragment:
... Another definition of links has been provided by Joe Bloggs. Joe has stated that: <simplelink xlink:href="bloggs.xml#xpointer(id('quote32')" xlink:show="embed" xlink:actuate="onLoad"/> ...
In this case, the content from the remote resource is embedded directly in the document. The show="embed" tag means that the content is viewed directly in the source document rather than being viewed independently. The actuate="onLoad" means that the embedding should occur immediately upon loading the source document.
Jack notices that the discussion compares several definitions of the term link, but the definition from the recent essay seems different than what he remembers. He selects the definition and, from the main menu, chooses to see the original source. A second window pops up, showing the definition in its original context of the essay. Jack notices that the definition has indeed been changed in the original material.
Transclusion: Supporting Access to Source
In the "embedding" example just described, the reader does not need to know that the content has been embedded from a different source. However, in the true spirit of transclusion, it is useful for the reader to be aware of this so that he can view the material in its original context, if desired. In this case, Jack has seen a quote and wants to see its original source. He selects the quote and then selects the appropriate menu option (which is, of course, dependent upon the particular implementation).
The browser could then retrieve the Bloggs.xml document and highlight the section indicated by the XPointer xpointer(id("quote32")). In effect, Jack is able to see the transcluded content in its original context.
Jack then returns to the original discussion of links and chooses to see an animation showing how a Web server might support generic links. While watching the animation, he sees a Web server interacting with a linkbase. He is unsure what a linkbase is. Next to the animation is a list of components shown within the animation (Server, Linkbase, Web Page, Network, and so on). Jack clicks Linkbase" and the list of words remains, but the single word Linkbase is replaced by a short description of the linkbase.
Link Semantics: Embedding Content
This part of the scenario illustrates an alternative use of embedding content. In this case, we have a list of words that forms the basis for anchors. When a word is selected, the relevant arc is traversed. Rather than causing a new document to be viewed (either in a new window or replacing the existing document), the content is embedded in the existing document. For example, consider the following fragment:
<components> <comp> <simplelink xlink:href="desc.xml#xpointer(//desc[name='server'])" xlink:show="embed" xlink:actuate="onRequest">Server </simplelink> </comp> <comp> <simplelink xlink:href="desc.xml#xpointer(//desc[name='linkbase'])" xlink:show="embed" xlink:actuate="onRequest">LinkBase </simplelink> </comp> ... </components>
Each word is an anchor for a link. The link, however, creates embedded content only when it is activated. Thus, when Jack selects a component name, the name is replaced by the description of that component. Effectively, this has implemented a partial folding editor.
The animation is also paused.
Link Semantics: Controlling Context
This final fragment of the scenario illustrates an even more complex situation. In this case, the document contains several media components. When we activate a link in one component of the document (by selecting a text name), we want to cause a change in the behavior of another component of the document (for example, pausing an animation). The current version of XLink does not allow behavior such as this to be explicitly specified, but it does provide an "extension" mechanism. XLink supports the show="other" attribute value and explicitly states that this could be used to instruct an application to look for other markup determining the presentation. We could then include suitable markup to explicitly define the behavior described above, possibly by appropriate use of style sheets (and, in particular, using the multi-switch and multi-property-set XSL-FO formatting object) or suitable scripting.
Jack reads this and then clicks the description. The description is again replaced by the single word, restoring the list to its original state. The animation recommences, and Jack continues watching, but now with a better understanding of the interaction being shown.