index.html
53.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Harvesting RDF Statements from XLinks</title>
<link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/TR/W3C-NOTE.css"><style type="text/css">
code { font-family: monospace; }
div.constraint,
div.issue,
div.note,
div.notice { margin-left: 2em; }
dt.label { display: run-in; }
li p { margin-top: 0.3em;
margin-bottom: 0.3em; }
</style></head>
<body>
<div class="head">
<p><a href="http://www.w3.org/"><img src="http://www.w3.org/Icons/w3c_home" alt="W3C" height="48" width="72"></a></p>
<h1>Harvesting RDF Statements from XLinks</h1>
<h2>W3C Note 29 September 2000</h2>
<dl>
<dt>This version:</dt>
<dd><a href="http://www.w3.org/TR/2000/NOTE-xlink2rdf-20000929/">http://www.w3.org/TR/2000/NOTE-xlink2rdf-20000929/</a> (available as <a href="Overview.xml">XML</a> and <a href="Overview.html">HTML</a>)
</dd>
<dt>Latest version:</dt>
<dd><a href="http://www.w3.org/TR/xlink2rdf">http://www.w3.org/TR/xlink2rdf</a>
</dd>
<dt>Editor:</dt>
<dd>
Ron Daniel Jr.
(Metacode Technologies Inc.)
<a href="mailto:rdaniel@metacode.com"><rdaniel@metacode.com></a>
</dd>
</dl>
<p class="copyright"><a href="http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © 2000 <a href="http://www.w3.org/"><abbr title="World Wide Web Consortium">W3C</abbr></a><sup>®</sup> (<a href="http://www.lcs.mit.edu/"><abbr title="Massachusetts Institute of Technology">MIT</abbr></a>, <a href="http://www.inria.fr/"><abbr lang="fr" title="Institut National de Recherche en Informatique et Automatique">INRIA</abbr></a>, <a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C <a href="http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>, <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a>, <a href="http://www.w3.org/Consortium/Legal/copyright-documents-19990405">document use</a>, and <a href="http://www.w3.org/Consortium/Legal/copyright-software-19980720">software licensing</a> rules apply.
</p>
</div>
<hr>
<div>
<h2><a name="abstract">Abstract</a></h2>
<p>Both XLink <a href="#XLink">[XLink]</a> and RDF <a href="#rdf">[RDF]</a> provide a way
of asserting relations between resources. RDF is primarily for describing
resources and their relations, while XLink is primarily for specifying and
traversing hyperlinks. However, the overlap between the two is sufficient
that a mapping from XLink links to statements in an RDF model can be defined.
Such a mapping allows XLink elements to be harvested as a source of RDF statements.
XLink links (hereafter, "links") thus provide an alternate syntax
for RDF information that may be useful in some situations.
</p>
<p>This Note specifies such a mapping, so that links can be harvested and
RDF statements generated. The purpose of this harvesting is to create RDF
models that, in some sense, represent the <em>intent</em> of the XML
document.
The purpose is <em>not</em> to represent the XLink structure in enough
detail that a set of links could be round-tripped through an RDF model.
</p>
</div>
<div>
<h2><a name="status">Status of This Document</a></h2>
<p>This Note is made available by the W3C
<a href="http://www.w3.org/XML/Activity#linking-wg">XML Linking Working Group</a>
for the consideration of the XLink and RDF communities in the hopes that
it may prove useful. However, it is not a formal product of the XML
Linking Working Group. Thus, it should not be construed as representing
the consensus of the XML Linking Working Group. Comments should be sent
to the public mailing-list <a href="mailto:www-rdf-interest@w3.org"
>www-rdf-interest@w3.org</a>(<a
href="http://lists.w3.org/Archives/Public/www-rdf-interest/"
>archive</a>). However, readers are advised that the XML Linking Working
Group has no plans to update this document.
</p>
<p>Publication of this Note by W3C indicates no endorsement by
W3C or the W3C Team, or any W3C Members.
</p>
<p>A list of <a href="http://www.w3.org/TR">current W3C Recommendations and
other technical documents</a> is available.</p>
</div>
<div class="toc">
<h2><a name="contents">Table of Contents</a></h2>
<p class="toc">1 <a href="#introduction">Introduction</a><br> 1.1 <a href="#terminology">Terminology</a><br> 1.2 <a href="#b2d248b3b1c17">Notation and Document Conventions</a><br>2 <a href="#principles">Principles of the Mapping</a><br>3 <a href="#spec">Mapping Specification</a><br> 3.1 <a href="#xptr_synth">Synthesizing XPointers</a><br> 3.2 <a href="#predicates">Generating RDF Predicates</a><br> 3.3 <a href="#simple_links">Simple Linking Elements</a><br> 3.4 <a href="#extended_links">Extended XML Links</a><br> 3.4.1 <a href="#arcs">arc-Type Element</a><br> 3.4.2 <a href="#locators">locator-Type Element</a><br> 3.4.3 <a href="#resources">resource-Type Element</a><br> 3.4.4 <a href="#titles">title-Type Element</a><br> 3.5 <a href="#linkbases">Linkbases</a><br>4 <a href="#bibliography">References</a><br></p>
<h3>Appendix</h3>
<p class="toc">A <a href="#xslt">Implementing the Harvesting in XSLT</a><br></p>
</div>
<hr>
<div class="body">
<div class="div1">
<h2><a name="introduction">1 Introduction</a></h2>
<p>The XLink specification <a href="#XLink">[XLink]</a> defines ways for
XML documents to establish hyperlinks between resources. The Resource
Description Framework specification <a href="#rdf">[RDF]</a> defines a
framework for the provision of machine-understandable information
about web resources.
</p>
<p>Both XLink and RDF provide a way of asserting relations between resources.
RDF is primarily for describing resources and their relations, while XLink
is primarily for specifying and traversing hyperlinks. However, the overlap
between the two is sufficient that a mapping from XLink links to statements
in an RDF model can be defined. Such a mapping allows XLink elements to be <a href="#harvest" title="Harvesting">harvested</a> as a source of RDF statements. XLink links
(hereafter, "links") thus provide an alternate syntax for RDF
information that may be useful in some situations.
</p>
<p>This Note specifies such a mapping, so that links can be harvested
and RDF statements generated. The purpose of this harvesting is to
create RDF models that, in some sense, represent the <em>intent</em>
of the XML document. The purpose is <em>not</em> to represent the
XLink structure in enough detail that a set of links could be
round-tripped through an RDF model.
</p>
<p>Readers of this Note are assumed to be familiar with
<a href="#XLink">[XLink]</a> and <a href="#rdf">[RDF]</a>. Terms that are defined
in those specifications will not be defined here. Readers should also
be familiar with XML Base <a href="#xbase">[XML Base]</a>.
Familiarity with the RDF Schema Candidate Recommendation
<a href="#rdfs">[RDFSchema]</a> will be necessary for those who wish to make
use of the mappings provided here that use RDF Schema Classes.
</p>
<div class="div2">
<h3><a name="terminology">1.1 Terminology</a></h3>
<p>[Definition: <a name="dt-must" title="Must, May, etc.">The key words</a> <b>must</b>, <b>
must not
</b>, <b>required</b>, <b>shall</b>, <b>shall
not
</b>, <b>should</b>, <b>should
not
</b>, <b>recommended</b>, <b>may</b>, and
<b>optional</b> in this specification are to be interpreted
as described in <a href="#rfc2119">[IETF RFC 2119]</a>.
]
</p>
<p>Some special terms are defined here in order to clarify
their relationship to similar terms used in the technologies
on which the mapping is based. Refer to <a href="#XLink">[XLink]</a> and
<a href="#rdf">[RDF]</a> for definitions of other technical
terms used here.
</p>
<dl>
<dt class="label">[Definition: <a name="harvest" title="Harvesting">harvesting</a>]
</dt>
<dd>
<p>The process of generating RDF statements from XLink elements.</p>
</dd>
<dt class="label">[Definition: <a name="resource" title="resource">Resource</a>]
</dt>
<dd>
<p>A "resource" is anything identified by a URI.</p>
</dd>
<dt class="label">[Definition: <a name="participating_resource" title="participating resource">Participating resource</a>]
</dt>
<dd>
<p>A resource that has been identified in a link to serve as a
potential starting or ending point of traversal.
</p>
</dd>
</dl>
</div>
<div class="div2">
<h3><a name="b2d248b3b1c17">1.2 Notation and Document Conventions</a></h3>
<p>The <code>xlink:</code> and <code>rdf:</code> prefixes are used throughout
to stand for the declaration of the XLink and RDF namespaces, respectively,
on elements in whose scope the so-marked element or attribute appears (on
the same element or on some ancestor element), whether or not a namespace
declaration is present in the example. The use of specific namespace prefixes
is an editorial convienience; as dictated by the Names in XML
Recommendation <a href="#XML-Names">[XML-Names]</a>, any prefix
<a href="#dt-must" title="Must, May, etc.">may</a> be used
as long as the URI it maps to is the correct one.
</p>
</div>
</div>
<div class="div1">
<h2><a name="principles">2 Principles of the Mapping</a></h2>
<p>Simple RDF statements are comprised of a subject, a predicate, and an object.
The subject and predicate are identified by URI references, and
the object may be a URI reference or a literal string. To map an
XLink link into an RDF statement, we need
to be able to determine the URI references of the subject and predicate. We must also
be able to determine the object, be it a URI reference or a literal.
</p>
<p>The general principle behind the mapping specified here is that each arc
in a link gives rise to one RDF statement. The starting resource of the arc
is mapped to the subject of the RDF statement. The ending resource of the
arc is mapped to the object of the RDF statement. The arc role is mapped to
the predicate of the RDF statement. However, a number of corner cases arise,
described in <a href="#spec"><b>3 Mapping Specification</b></a>.
</p>
<p>RDF statements are typically collected together into "models."
The details of how models are structured are implementation dependent. This
Note assumes that harvested statements are added to "the current
model," which is the model being constructed when the
statement was harvested.
But this Note, like <a href="#rdfs">[RDFSchema]</a>, does not specify exactly how models
must be structured.
</p>
</div>
<div class="div1">
<h2><a name="spec">3 Mapping Specification</a></h2>
<p>The following sections describe the mapping in detail.</p>
<div class="div2">
<h3><a name="xptr_synth">3.1 Synthesizing XPointers</a></h3>
<p>RDF is based on the use of URIs for identifying resources. In XLink, the
linking element itself (in the case of a simple link) or a subelement of the
linking element (in the case of an extended link) often serves as one of the
participating resources in the link. This requires that we be able to
define URI references that identify those linking elements.
Those URI references
<a href="#dt-must" title="Must, May, etc.">must</a> follow the XPointer specification.
</p>
<p>Any legal XPointer that identifies the proper element is allowed.
However, in order that
different implementations harvest equivalent RDF statements from
an XLink, the procedure in this section <a href="#dt-must" title="Must, May, etc.">
should
</a> be used when synthesizing XPointers for such
linking elements.
The general approach recommended is for the synthesized XPointer
to do element-wise navigation down the tree to reach the linking
element. The navigation begins at the nearest identified point
in the tree.
</p>
<p>More formally, the base of the synthesized URI reference
<a href="#dt-must" title="Must, May, etc.">shall</a> be specified as defined
in <a href="#xbase">[XML Base]</a>.
</p>
<p>The fragment identifier of the synthesized URI reference
<a href="#dt-must" title="Must, May, etc.">shall</a> be delimited from the
URI by the '#' character, as
required by RFC 2396<a href="#rfc2396">[RFC 2396]</a>. The fragment identifier
of the synthesized URI reference <a href="#dt-must" title="Must, May, etc.">shall</a>
be an XPointer<a href="#xptr">[XPTR]</a>.
</p>
<p>The XPointer <a href="#dt-must" title="Must, May, etc.">should</a> follow the
production:
<h5>Recommended Syntax for Synthesized XPointers</h5>
<table class="scrap">
<tbody>
<tr>
<td><pre>
XPointer ::= Name
| ChildSeq
ChildSeq ::= '/' [1-9] [0-9]* ('/' [1-9] [0-9]*)*
| Name ('/' [1-9] [0-9]*)+
</pre></td>
</tr>
</tbody>
</table>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>This is an edited version of the
<a href="http://www.w3.org/TR/xptr#NT-ChildSeq">ChildSeq</a>
production, assuming
that the production is updated in line with recent working group
discussions. In the case of any differences between this document and
the final XPointer specification, the XPointer specification's definition
of ChildSeq should be followed.
</p>
</div>
<p>The initial locator term
of the XPointer <a href="#dt-must" title="Must, May, etc.">should</a> be an ID
reference to the nearest ancestor of the linking element, including
the linking element itself, that bears an attribute of type
<code>ID</code>. If no such attribute exists on any ancestor of
the linking element, the '/' character
<a href="#dt-must" title="Must, May, etc.">should</a> be the first linking term,
indicating that navigation proceeds from the document element.
</p>
<p>As an example, consider a document that contains the following
simple link:
</p>
<table class="eg" cellpadding="5" border="1" bgcolor="#99ffff" width="100%">
<tr>
<td><pre>In heavy trading, <org
xlink:type='simple'
xlink:href="http://www.foo.com/"
xml:base="http://www.bar.com/report1"
ID="com231"
>Foo Manufacturing</org> closed sharply lower...</pre></td>
</tr>
</table>
<p>The synthesized XPointer for this linking element is:</p>
<table class="eg" cellpadding="5" border="1" bgcolor="#99ffff" width="100%">
<tr>
<td><pre>http://www.bar.com/report1#com231</pre></td>
</tr>
</table>
</div>
<div class="div2">
<h3><a name="predicates">3.2 Generating RDF Predicates</a></h3>
<p>Unless stated otherwise, RDF statements are generated to represent the
information for the arcs in a link. The value of
the <code>xlink:arcrole</code> attribute, if one
is given on an "arc"-type element or
"simple"-type element,
<a href="#dt-must" title="Must, May, etc.">must</a> be mapped to
the predicate of the RDF statement. Note that the value of
the <code>xlink:arcrole</code> attribute is already required,
by the XLink specification, to be a URI reference.
</p>
<p>If no <code>xlink:arcrole</code> attribute is specified,
harvesting software <a href="#dt-must" title="Must, May, etc.">should not</a> generate
an RDF statement. That is certainly the safest course. However,
many XML files may not have arcrole attributes. Implementations that
wish to attempt to harvest RDF statements from such files
<a href="#dt-must" title="Must, May, etc.">may</a> map
the element type of the linking element to the predicate
of the RDF statement, as long as the element type is namespace
qualified. This ensures that an an absolute URI reference can
be constructed from the namespace
URI and the local part. In this case the namespace name and the
local part are concatenated to synthesize the absolute URI
reference for the predicate. Implementations
<a href="#dt-must" title="Must, May, etc.">should</a> examine the namespace
URI to test if it ends in one of the URI characters '#', '?', or
'/'. If it does then the namespace URI and the local part
<a href="#dt-must" title="Must, May, etc.">shall</a> be concatenated using the
simple approach documented in <a href="#rdf">[RDF]</a>. If the namespace
URI does not end in such a character, implementations
<a href="#dt-must" title="Must, May, etc.">may</a> create a URI reference by
inserting a '#' character. Note however that such URI references
<a href="#dt-must" title="Must, May, etc.">must not</a> be exchanged with external
parties, as they are not guaranteed to actually exist.
</p>
</div>
<div class="div2">
<h3><a name="simple_links">3.3 Simple Linking Elements</a></h3>
<p>If a simple link's <code>xlink:arcrole</code> attribute has the
value "http://www.w3.org/1999/xlink/properties/linkbase",
the link <a href="#dt-must" title="Must, May, etc.">shall</a> be harvested according
to section <a href="#linkbases"><b>3.5 Linkbases</b></a>.
Otherwise the mapping defined in this section
<a href="#dt-must" title="Must, May, etc.">shall</a> be used.
</p>
<p>All simple links define zero or one traversal arcs. No traversal
arc is specified if the <code>xlink:href</code> attribute is not specified.
Therefore, harvesting software <a href="#dt-must" title="Must, May, etc.">shall not</a>
generate an RDF statements if there is no <code>xlink:href</code> attribute
in the link.
</p>
<p>The starting resource of the simple link
<a href="#dt-must" title="Must, May, etc.">shall</a> be mapped to the
subject of the RDF statement. Note that the starting resource of a
simple link is the linking element itself. Therefore, the harvesting
software <a href="#dt-must" title="Must, May, etc.">must</a> create a URI
reference that identifies the linking element, as defined in
section <a href="#xptr_synth"><b>3.1 Synthesizing XPointers</b></a>.
</p>
<p>The predicate of the RDF statement is obtained from the simple
Link as defined in <a href="#predicates"><b>3.2 Generating RDF Predicates</b></a>.
</p>
<p>The ending resource of the simple link
<a href="#dt-must" title="Must, May, etc.">shall</a> be mapped to the object of
the RDF statement. Note that the ending resource
of a simple link is always a URI reference, provided as the value of
the <code>xlink:href</code> attribute.
</p>
<p>If an <code>xlink:role</code> attribute is specified on the simple
link, it <a href="#dt-must" title="Must, May, etc.">shall</a> result in an
additional statement being added to the model. The subject of
the statement is the ending resource of the simple link,
its predicate is "<code>rdf:type</code>", and its
object is the resource identified by the role attribute.
</p>
<p>If an implementation wishes to use facilities defined in the
RDF Schema specification <a href="#rdfs">[RDFSchema]</a>, it
<a href="#dt-must" title="Must, May, etc.">may</a> add a second statement to the
RDF model when an <code>xlink:role</code> attribute is specified.
The subject of the second statement is the resource identified by
the <code>role</code> attribute, its predicate is
"<code>rdf:type</code>", and its object is the
resource "rdfs:Class". The second statement
<a href="#dt-must" title="Must, May, etc.">should</a> only be added to
the model if an equivalent statement is not already part of the
model.
</p>
<p>An example of a simple linking element is:</p>
<table class="eg" cellpadding="5" border="1" bgcolor="#99ffff" width="100%">
<tr>
<td><pre>... In a <x:extRef
xlink:type="simple"
xlink:href="http://www.foo.com/papers/crops.txt"
xlink:arcrole="http://links.org/namespace/cite"
xlink:role="http://links.org/namespace/screed"
>recent paper</x:extRef>, Dr. Taylor assumes that ...</pre></td>
</tr>
</table>
<p>Mapping that link according to this specification (and assuming it was
the fourth child element within the third child element of the document)
results in the RDF model shown below:
</p>
<img src="xlink2rdf-fig1.gif" alt="RDF model with 3 arcs">
<p>If the <code>xlink:role</code> attribute had not been specified, then
the result would have been the RDF model shown below:
</p>
<img src="xlink2rdf-fig2.gif" alt="RDF model with 1 arc">
</div>
<div class="div2">
<h3><a name="extended_links">3.4 Extended XML Links</a></h3>
<p>We first describe the rules for harvesting the components of an
extended link (arcs, locators, and resources). Then we describe the
rules for the extended link as a whole.
</p>
<div class="div3">
<h4><a name="arcs">3.4.1 <code>arc</code>-Type Element
</a>
</h4>
<p>If an arc contains an <code>xlink:arcrole</code> attribute whose
value is "http://www.w3.org/1999/xlink/properties/linkbase",
it <a href="#dt-must" title="Must, May, etc.">shall</a> be harvested according to the
procedure in section <a href="#linkbases"><b>3.5 Linkbases</b></a>. Otherwise the procedures
in this section <a href="#dt-must" title="Must, May, etc.">shall</a> be used.
</p>
<p>
XLink elements of the <code>arc</code> type use the <code>xlink:to</code>
and <code> xlink:from</code> attributes to specify the endpoints of
zero or more possible traversals by referencing, not URIs, but
rather labels that have been defined in the <code>xlink:label</code>
attributes of <code>locator</code>-type and <code>resource</code>-type elements.
</p>
<p>
The number of RDF statements harvested from a single <code>arc</code>-type
element is equal to the number of possible traversals specified by that
element.
That quantity is the multiplicative product of the number of resource and/or
locator elements identified by the <code>xlink:to</code> and <code>xlink:from
</code> attributes. Each RDF statement will correspond to one and only one
of the traversals.
</p>
<p>
The starting resources of the traversals
<a href="#dt-must" title="Must, May, etc.">shall</a> be mapped to the subject of
the RDF statement(s). The ending resources of
the traversals <a href="#dt-must" title="Must, May, etc.">shall</a> be mapped to
the object of the RDF statement(s). The predicate of the RDF statement
is obtained as specified in <a href="#predicates"><b>3.2 Generating RDF Predicates</b></a>.
</p>
<p>Note that any element content of an arc is not harvested.</p>
</div>
<div class="div3">
<h4><a name="locators">3.4.2 <code>locator</code>-Type Element
</a>
</h4>
<p>Each XLink <code>locator</code>-type element gives rise to zero or
more statements in the RDF model. The subject of all of those
statements is the value of the <code>xlink:href</code> attribute of
the locator, except as noted below.
</p>
<p>
If the locator element provides an <code>xlink:role</code> attribute,
one additional statement <a href="#dt-must" title="Must, May, etc.">shall</a> be
added to the model. The value of the locator's <code>xlink:href</code>
attribute <a href="#dt-must" title="Must, May, etc.">shall</a> be mapped to the
subject of the statement. The value of the <code>xlink:role</code>
attribute <a href="#dt-must" title="Must, May, etc.">shall </a> be mapped to the
object, and the predicate <a href="#dt-must" title="Must, May, etc."> shall</a>
be "rdf:type". Harvesting software that uses the
facilities of the RDF Schema specification <a href="#dt-must" title="Must, May, etc.">
may
</a> generate an additional statement whose subject is the
value of the <code>xlink:role</code> attribute, whose predicate is
"rdf:type" and whose object is "rdfs:Class".
The second statement <a href="#dt-must" title="Must, May, etc.">should not</a> be
added to the RDF model if an equivalent statement already exists in
the model.
</p>
<p>
If the locator element provides an <code>xlink:label</code> attribute, an
RDF statement is added to the model. The value of the href attribute <a href="#dt-must" title="Must, May, etc.">shall</a> be mapped to the subject of the statement. The
predicate of the statement <a href="#dt-must" title="Must, May, etc.">shall</a> be <code>
xlink:label
</code>. The object of the statement <a href="#dt-must" title="Must, May, etc.">shall
</a> be the value of the <code>xlink:label</code> attribute.
</p>
<p>If the locator element provides an <code>xlink:title</code> attribute, an
RDF statement <a href="#dt-must" title="Must, May, etc.">shall</a> be added to the model.
The value of the <code>xlink:href</code> attribute <a href="#dt-must" title="Must, May, etc.">shall
</a> be mapped to the subject of the statement. The predicate of the
statement <a href="#dt-must" title="Must, May, etc.">shall</a> be
"<code>xlink:title</code>".
The object of the statement <a href="#dt-must" title="Must, May, etc.">shall</a> be the
value of the title attribute.
</p>
<p>If the resource element contains one or more title elements, they
are harvested as described in section <a href="#titles"><b>3.4.4 title-Type Element</b></a>.
</p>
</div>
<div class="div3">
<h4><a name="resources">3.4.3 <code>resource</code>-Type Element
</a>
</h4>
<p>Each XLink <code>resource</code>-type element gives rise to zero or
more statements in the RDF model. Unless noted
otherwise, the subject of all of those statements is the resource element
itself, identified by an XPointer synthesized according to the procedure described
in section <a href="#xptr_synth"><b>3.1 Synthesizing XPointers</b></a>.
</p>
<p>If the resource element provides an <code>xlink:role</code> attribute, one
RDF statement <a href="#dt-must" title="Must, May, etc.">shall</a> be added to the model,
and a second RDF statement <a href="#dt-must" title="Must, May, etc.">may</a> be added to
the model. The subject of the first statement is the synthesized URI reference
for the resource. The value of the xlink:role attribute is mapped to the object
of the statement. The predicate of the statement is '<code>rdf:type</code>'.
A second statement <a href="#dt-must" title="Must, May, etc.">may</a> be added to the model
if the software supports the RDF Schema specification <a href="#rdfs">[RDFSchema]</a>.
The value of the <code>xlink:role</code> attribute is mapped to the subject
of the optional statement. The predicate of the statement is "rdf:type
" and the object is "rdfs:Class". The second
statement <a href="#dt-must" title="Must, May, etc.">should not</a> be added to the
model if an identical statement already exists in the model.
</p>
<p>If the resource element provides an <code>xlink:label</code> attribute,
another RDF statement <a href="#dt-must" title="Must, May, etc.">shall</a> be added to
the model. The subject of the statement is the synthesized URI reference
for the resource. The predicate of the statement is
"xlink:label". The object of the statement is the value of
the label attribute.
</p>
<p>If the resource element provides an <code>xlink:title</code> attribute, another
RDF statement <a href="#dt-must" title="Must, May, etc.">shall</a> be added to the model.
The subject of the statement is the synthesized URI reference for the resource.
The predicate of the statement is "xlink:title". The object of
the statement is the value of the title attribute.
</p>
<p>If the resource element contains one or more title elements, they are harvested
as described in section <a href="#titles"><b>3.4.4 title-Type Element</b></a>.
</p>
</div>
<div class="div3">
<h4><a name="titles">3.4.4 <code>title</code>-Type Element
</a>
</h4>
<p>XLink <code>title</code>-type elements have an XLink-defined meaning
only if they appear as a child element within an extended, locator,
or resource element.
</p>
<p>If an XLink <code>extended</code>-, <code>locator</code>-, or
<code>resource</code>-type element contains one or more
<code>title</code>-type elements, one RDF statement <a href="#dt-must" title="Must, May, etc.">shall</a> be added to the model for each
title element.
The subject of the statement <a href="#dt-must" title="Must, May, etc.">shall</a>
be either the value of the <code>xlink:href</code> attribute (in the
case of a <code>locator</code> element) or a synthesized XPointer identifying
the <code>extended</code> or <code>resource</code> element. The predicate
of the statement
<a href="#dt-must" title="Must, May, etc.">shall</a> be <code>xlink:title</code>.
The object of the statement
<a href="#dt-must" title="Must, May, etc.">shall</a> be a synthesized XPointer
identifying the title element. (Identifying the title element, rather
than just its content, allows attributes such as <code>xml:lang</code>
to be captured along with the title.)
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>
Implementations <a href="#dt-must" title="Must, May, etc.">may</a> add a second
RDF statement to the model for each <code>title</code>-type element.
The object of the second statement shall be a synthesized XPointer
identifying the title element. The predicate of the second statement
shall be <code>rdf:value</code>. The object of the second statement
shall be the content of the title element. (If the title element
contains mixed content, the object is a string containing XML markup.
The implementation's facilities for dealing with situations
where the <code>rdf:parseType</code> attribute has the value
"literal" will be needed.)
</p>
</div>
<p>As an example, consider the following fragment of an extended
link:
</p>
<table class="eg" cellpadding="5" border="1" bgcolor="#99ffff" width="100%">
<tr>
<td><pre><annotation xlink:type='extended' ID='genid22'>
<caption xlink:type='title' ID='genid23'><i>Recent</i> comments</caption>
<link xlink:type='arc' ...</pre></td>
</tr>
</table>
<p>The RDF statements harvested from the title are shown below:</p>
<img src="xlink2rdf-fig3.gif" alt="RDF model with 2 arcs, second one pointing at <i>Recent</i>"></div>
</div>
<div class="div2">
<h3><a name="linkbases">3.5 Linkbases</a></h3>
<p>A linkbase is an XML document which functions like a database of
links. A linkbase arc is an XLink element (<code>simple</code>- or
<code>arc</code>-type) whose <code>xlink:arcrole</code> attribute takes the value
of "http://www.w3.org/1999/xlink/properties/linkbase".
The ending resource of a linkbase arc is a linkbase.
</p>
<p>When harvesting software encounters a linkbase arc, it
<a href="#dt-must" title="Must, May, etc.">shall not</a> generate an RDF statement for
the arc. It <a href="#dt-must" title="Must, May, etc.">should</a> traverse the arc to
retrieve the linkbase, and harvest the links from the linkbase to add to
the current model using the methods specified in this Note.
</p>
<div class="note">
<p class="prefix"><b>Note:</b></p>
<p>Different applications might make different tradeoffs on depth of
traversal in light of varying network conditions. This Note does not
mandate specific behavior, but does <a href="#dt-must" title="Must, May, etc.">recommend
</a> that all havesting applications attempt to obtain at
least the immediately referenced linkbase.
</p>
</div>
</div>
</div>
<div class="div1">
<h2><a name="bibliography">4 References</a></h2>
<dl>
<dt class="label"><a name="XLink">XLink</a></dt>
<dd>
Steve DeRose, Eve Maler, David Orchard, and Ben Trafford, editors. <cite>
XML Linking Language (XLink)
</cite>. World Wide Web Consortium, 2000.
(See <a href="http://www.w3.org/TR/xlink">http://www.w3.org/TR/xlink</a>.)
</dd>
<dt class="label"><a name="XML-Names">XML-Names</a></dt>
<dd>Tim Bray, Dave Hollander, and Andrew Layman, editors. <cite>
Namespaces in XML
</cite>. Textuality, Hewlett-Packard, and Microsoft.
World Wide Web Consortium, 1999. (See <a href="http://www.w3.org/TR/REC-xml-names">http://www.w3.org/TR/REC-xml-names</a>.)
</dd>
<dt class="label"><a name="rfc2119">IETF RFC 2119</a></dt>
<dd>S. Bradner, editor. <cite>
Key words for use in RFCs to Indicate Requirement Levels
</cite>. March
1997. (See <a href="http://www.ietf.org/rfc/rfc2119.txt">http://www.ietf.org/rfc/rfc2119.txt
</a>.)
</dd>
<dt class="label"><a name="rdf">RDF</a></dt>
<dd>Ora Lassila and Ralph Swick, editors. <cite>Resource Description
Framework (RDF) Model and Syntax Specification
</cite>. World Wide Web
Consortium, 1999. (See <a href="http://www.w3.org/TR/REC-rdf-syntax">http://www.w3.org/TR/REC-rdf-syntax</a>.)
</dd>
<dt class="label"><a name="xptr">XPTR</a></dt>
<dd>Ron
Daniel, Steve DeRose, and Eve Maler, editors.<cite> XML Pointer Language
(XPointer) V1.0
</cite>. World Wide Web Consortium, 1998.
(See <a href="http://www.w3.org/TR/xptr">http://www.w3.org/TR/xptr</a>.)
</dd>
<dt class="label"><a name="rfc2396">RFC 2396</a></dt>
<dd>
RFC 2396: Uniform Resource Identifiers. Internet Engineering Task Force,
1995. (See <a href="http://www.ietf.org/rfc/rfc2396.txt">http://www.ietf.org/rfc/rfc2396.txt</a>.)
</dd>
<dt class="label"><a name="rdfs">RDFSchema</a></dt>
<dd>
Dan Brickley, R.V. Guha, editors. <cite>Resource Description
Framework (RDF) Schema Specification 1.0
</cite>. World Wide Web
Consortium, 2000.
(See <a href="http://www.w3.org/TR/rdf-schema">http://www.w3.org/TR/rdf-schema</a>.)
</dd>
<dt class="label"><a name="xbase">XML Base</a></dt>
<dd>Jonathan Marsh, editor. <cite>XML Base (XBase)
</cite>. World Wide Web Consortium, 1999. (See <a href="http://www.w3.org/TR/xmlbase">http://www.w3.org/TR/xmlbase</a>.)
</dd>
</dl>
</div>
</div>
<div class="back">
<div class="div1">
<h2><a name="xslt">A Implementing the Harvesting in XSLT</a></h2>
<p>One way of harvesting RDF statements from XML documents that contain
XLinks is through the use of XSLT. This appendix presents a simple
example of such a harvester. It has a number of limitations. It does
not generate the synthesized XPointers which are preferred for reasons
of interoperability. Second, it uses a Java extension function for
adding statements to an RDF storage manager. There is no standard API
for such a storage manager. Accordingly,
this appendix is provided as an example only. It does not
specify any normative behavior.
</p>
<p>
The stylesheet itself is given in listing 1. Its operation is
very simple. It looks for simple XLinks, stores the subject, object,
and predicate in variables, then calls an extension function to add
the RDF statement to some storage mechanism.
</p>
<p>
<table class="eg" cellpadding="5" border="1" bgcolor="#99ffff" width="100%">
<tr>
<td><pre>
<!--
Simple XSLT stylesheet to harvest RDF statements from simple
XLinks. XLinks are detected and an extension function called
to add RDF statements to an RDF repository. The extension function
is a very simple mockup that just prints its arguments to stdout.
Note that the repository is updated as a side effect of
examining the document. While practical, this is somewhat at odds
with the philosophy behind XSLT. Any application that actually
cares about the order in which RDF statements are made is
cautioned about using this approach.
Credit where due: I got a head start on this by using Dan Connolly's
stylesheet that tried to turn XLinks into RDF's XML syntax.
Ron Daniel Jr.
rdaniel@metacode.com 2000-09-15
-->
<xsl:stylesheet
version="1.0"
xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"
xmlns:rdf ="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:rdfs ="http://www.w3.org/TR/rdf-schema/"
xmlns:Radix="http://www.example.com/com.example.Radix"
>
<!-- Some 'useful' declarations. -->
<xsl:variable name='rdf-type'
select='"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"'/>
<xsl:variable name='rdfs-class'
select='"http://www.w3.org/TR/rdf-schema#Class"'/>
<xsl:output method="text"/>
<!-- Look for simple links that are linkbase references, ignore them.
(This rule is explicitly given a higher priority
than the system-assigned priorities of the other rules so
that it will match and discard linkbase references.)
-->
<xsl:template priority="2"
match='*[@xlink:type="simple"][@xlink:arcrole=
"http://www.w3.org/1999/xlink/properties/linkbase"]'>
<!-- For now, do nothing. A more complete example could pull in
the linkbase and harvest its content.
-->
</xsl:template>
<!-- Process the simple links that are not linkbase references.
Pull the various bits of info into variables and then call the
extension function.
(Make sure that we have an href specified. If not, there is no
arc to add to the RDF model.)
-->
<xsl:template match='*[@xlink:type="simple"][@xlink:href]'>
<!-- Subject - Synthesizing the XPointer in an interoperable way is
left for more ambitious examples. For simplicity, just generate
a unique ID.
-->
<xsl:variable name='subject'
select='concat("#xpointer-for-", generate-id())'/>
<!-- Predicate name comes from arcrole (preferred) or element type
(allowed). Look for arcrole, but if it doesn't exist, use
element name. (Note that we have to concatenate the namespace
URI and the local name according to the RDF spec to make a URI
reference. This should really test to see if namespace URI
ends with #, /, or ?)
-->
<xsl:variable name='predicate'>
<xsl:choose>
<!-- Get arcrole attribute if possible. -->
<xsl:when test='@xlink:arcrole'>
<xsl:value-of select='@xlink:arcrole'/>
</xsl:when>
<!-- If no arcrole, use element type as long as there is a
namespace URI so it can be made into a URI reference.
-->
<xsl:when test='namespace-uri()'>
<xsl:value-of select='concat(namespace-uri() , name())'/>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:variable name='object' select='string(@xlink:href)'/>
<xsl:variable name='objType' select='string(@xlink:role)'/>
<!-- Here it is - the main call to add a statement to the
RDF database.
-->
<xsl:if test='$predicate'>
<xsl:value-of select='Radix:addStatement($subject,
string($predicate), $object)'/>
</xsl:if>
<!-- Additional call if xlink:role specified. (We rely on the
underlying RDF storage implementation to deal with possible
multiple additions of the rdf:type(objType, rdfs:Class)
statement).
-->
<xsl:if test='$objType'>
<xsl:value-of select='Radix:addStatement($object,
$rdf-type, $objType)'/>
<xsl:value-of select='Radix:addStatement($objType,
$rdf-type, $rdfs-class)'/>
</xsl:if>
</xsl:template>
<!-- don't pass text thru -->
<xsl:template match="text()|@*">
</xsl:template>
</xsl:stylesheet>
</pre></td>
</tr>
</table>
<p>The stylesheet makes use of an extension function,
<code>Radix:addStatement(subject, predicate, object)</code>, which
would actually add the statement to an RDF storage manager. For
demonstration purposes, a dummy implementation of that extension
function is given in listing 2. This was tested using the Saxon
implementation of XSLT. Other implementations may have different
conventions for the use of extension functions.
</p>
<p>
<table class="eg" cellpadding="5" border="1" bgcolor="#99ffff" width="100%">
<tr>
<td><pre>
package com.example;
/** Simple demo of a RDF interface. This one is trivial, it has
* one call that lets statements be added.
*/
public class Radix
{
/** Mockup of a routine to add RDF statements to a model being
* constructed. Prints the subject, predicate, and object on
* different lines with progressive indention to make it easy
* to read.
*/
public static String
addStatement(String subject, String predicate, String object)
{
System.out.println(predicate + "\n " + subject + "\n " + object);
return "";
}
}
</pre></td>
</tr>
</table>
</div>
</div>
</body>
</html>