Co będzie?
I. Część
- Co to jest standard XMLowy?
- Standardy do określania powiązań między dokumentami XMLowymi:
XLink, XPointer, XInclude
- Parę standardów pomocniczych: XML-Names, XML-Base, XPath
- Trochę o moim programie
- Dużo przykładów
II. Część
TopicMaps, czyli sposób na przechowywanie informacji semantycznej w plikach.
Co to tak naprawdę XML?
Czyli co zawiera specyfikacja XML 1.0
- Składnia: preambuła (<?xml version="1.0">),
tagi (<elt atr="wart">),
komentarze (<!-- .. --!>),
instrukcje preprocesora (<?target action-or-sth-else?>),
deklaracja typu dokumentu (<!DOCTYPE ...>), DTD
- Encje wewnętrzne, zewnętrzne, parsowalne, nieparsowalne (służą strukturalizacji
dokumentów i DTD)
- Identyfikacja kodowania plików, UTF-8
- Definicja dokumentu poprawnego (ang. valid) oraz składnego (ang. well-formed,
dobrze sformułowanego)
A czego nie ma w specyfikacji?
Jeżeli każdy może sobie dowolnie konstruować pliki to
jak tu definiować jakieś ogólne standardy?
Mówiąc o standardzie nie mam tu na myśli żadnego wcielenia XMLa
(np. XHTML albo MathML), ale standard wspólny dla wszystkich wcieleń.
Namespaces in XML
Przestrzenie nazw (XML-Names) umożliwiają używanie w jednym
dokumencie elementów z różnych wcieleń XMLa.
Na przykład w dokumencie XHTMLowym można umieścić równanie
zapisane w standardzie MathML:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:math="http://www.w3.org/1998/Math/MathML" ... >
...
<body>
<p>
Mój ulubiony wielomian to
<math:apply>
<math:plus/>
<math:apply>
<math:power/>
<math:ci>x</math:ci>
<math:cn>2</math:cn>
</math:apply>
<math:cn>1</math:cn>
</math:apply>
</p>
...
</body>
</html>
Składnia XML-Names
- Za pomocą atrybutów xmlns:prefix="url" definuje odwzorowanie
prefiksów na URLe
- URLe nie muszą pokazywać na istniejącą stronę, ale zapewniają
jednoznaczność: system jest podobny do nazw pakietów w Javie.
- Aplikacje przetwarzające interpretują URLe, a nie prefiksy! Prefiksy są
tylko do czytania przez ludzi.
- Przykładowe URLe:
- "http://www.w3.org/1999/xhtml", dla XHTMLa (zwykle się zapisuje bez prefiksu)
- "http://www.w3.org/1998/Math/MathML", dla MathML (zwykle prefiks math)
- "http://www.w3.org/1999/XSL/Transform", dla XSLa (zwykle prefiks xsl)
Składnia XML-Names - c.d.
- Istnieje domyślna przestrzeń nazw, deklaruje się ją przez xmlns="url";
należą do niej elementy bez prefiksów
- Atrybuty też mogą należeć do przestrzeni nazw
- Można w ogóle nie określić przestrzeni nazw
- W specyfikacji XML 1.0 dwukropek nie ma szeczególnego znaczenia (można
nazwać element <a::b:c/>), ale większość aplikacji wymaga by dokument
był zgodny z XML-Names
- prefiks xmlns ma przyporządkowany pusty URL
XML-Names w przykładach
Dwa poniższe dokumenty powinny być (muszą!) zinterpretowane tak samo.
<root xmlns="http://karolb.prv.pl/ns1">
<a:elt xmlns:a="http://karolb.prv.pl/ns2">
<a:sub atr="value1"/>
</a:elt>
<second/>
</root>
<b:root
xmlns="http://karolb.prv.pl/ns2"
xmlns:b="http://karolb.prv.pl/ns1">
<elt>
<sub b:atr="value1"/>
</elt>
<second xmlns="http://karolb.prv.pl/ns1"/>
</b:root>
Powiązanie standardów
- XPointer to część wspólna XLink i XInclude
- XPath to część wspólna XPointer i XSLT
Obrazek w formacie SVG
Prosty język zapytań: XPath
- Został wymyślony do wykorzystania w XSLT i XPointerze
- Ma składnie nie-XMLową
- Zapytanie XPath zwraca zbiór węzłów (ang. Node-Set), węzłami
są m. in. elementy i atrybuty
- Zapytania XPath są bezwzględne (zaczynające się od /) lub
względne (pozostałe)
- Zapytania względne są liczone względem jakiegoś węzła
kontekstowego (ang. context node)
Przykłady XPath
- para - zbiór podelementów węzła kontekstowego o nazwie para
- * - wszystkie dzieci węzła kontekstowego
- @version - węzeł odpowiadający atrybutowi o nazwie version
- @* - wszystkie atrybuty
- text() - wszystkie podwęzły tekstowe, np. dla
<elt>ala</elt> będzie to węzeł ala (a tak formalnie to zbiór
trzech węzłów, bo każdy znak Unicode'a to oddzielny węzeł)
- para[1] - pierwszy podelement o nazwie para, para służy
do oznaczeniu paragrafów np. w DocBooku (wcielenie XMLa)
- para[last()] - ostatni podparagraf
Przykładów z XPath c. d.
- */para - wszystkie para-wnuki :)
- /doc/para[2]/section[1] - ścieżka bezwględna, wiadomo
- //para - specjalny skrótowy zapis, wszystkie paragrafy z dokumentu
- //chapter/para[1]/title - tytuły pierwszych sekcji wszystkich rozdziałów
- /doc/chapter[3]//link - wszystkie linki z trzeciego rozdziału
- ../title - podelement title rodzica, . to węzeł kontekstowy
- para[@lang="pl"][2] - drugi podparagraf z tych po polsku
- para[2][@lang="pl"] - drugi podparagraf o ile jest po polsku
- child::para - to to samo co para, tak naprawdę to para jest
tylko skrótem do tego wyrażenia
- following-sibling::*[1] - następny element po węźle kontekstowym
XPath w dokumencie
Zapytanie: /doc//para/title
Dokument z zaznaczonym wynikiem:
<?xml version="1.0"?>
<doc>
<title>Sample document</title>
<para>
<title>Introduction</title>
<para>...</para>
</para>
<para>
<para>
<title><b>XPath</b> implementation</title>
<para>
...
</para>
</para>
</doc>
Wyjaśnienia do zapytań
- XPath ma funkcje arytmetyczne, funkcje na stringach
- operuje na drzewowym modelu dokumentu, w którym węzłami są: elementy, atrybuty,
komentarze, instrukcje preprocesora, korzeń drzewa, tekst
- Gdzie go używać: jako wartości atrybutów w XSLT
- Zapis para[1] to skrót od para[position() = 1]
- Model działania: zaczynamy od zbioru zawierającego węzeł kontekstowy.
Dla każdej części ścieżki: weź element ze zbioru początkowego, znajdź dla niego
elementy pasujące do osi ( ang. axis, np child::) dorzuć je do zbioru
wynikowego, przefiltruj zbiór wynikowy przez predykat (np. [@lang="pl"]).
XPointer
- To tylko drobne rozszerzenie XPath
- Też ma składnię nie-XMLową
- Został przewidziany jako fragment identifer do wykorzystaniu w URLach, np.
http://karolb.prv.pl/test-doc.html#xpointer(/doc/para[1])
- XPath pozwalał wybierać tylko zbiory węzłów, XPointer
potrafi wskazać dowolny fragment dokumentu
- Przykład: <para>This is a <emp>very important</emp>
text<para>, można
zbudować zapytanie wybierające z dokumentu zaznaczony fragment.
Składnia XPointera: części
- Pełny adres XPointera składa się z części, każda ma nazwę schematu i wyrażenie w nawiasach,
np. xmlns(a="http://karolb.prv.pl/ns1")xpointer(//a:sub) ma dwie części.
- Specyfikacja definiuje znaczenie tylko dwóch schematów: xmlns oraz xpointer, pozostałe
przeznaczone są na później
- xmlns służy do tworzenia odwzrowań między prefiksami a URLami (XML-Names),
a xpointer zwraca zbiór lokacji
- Lokacja to albo węzeł albo przedział
- Jest też skrócona forma dla zgodności z HTMLem: id1 to to samo co
xpointer(id(id1))
Składnia XPointera: wybieranie węzłów
- To samo co w XPath oraz dwie nowe funkcje:
- funckja range-to do tworzenia przedziałów, np.
- xpointer(/doc/chapter[1]/range-to(chapter[3])) wybierze
przedział od początku pierwszego rozdziału do końca trzeciego
- xpointer(//start-mark/range-to(following-sibling::end-mark[1])
wybierze z dokumentu wszystkie przedziały zawarte między odpowiednimi parami
znaczników <start-mark/> i <end-mark/>
- funkcja string-range do znajdowania tekstu, np.
- string-range(/, "XML") tworzy zbiór zawierający przedziały
reprezentujące napis "XML", np. <para> MSXML4 is a new
XML processor.</para>
- string-range(//chapter/title, "Big") zwraca przedziały ze
słowem Big z tytułów rozdziałów.
- string-range może mieć dodatkowe parametry, które zwiększają/zmniejszają
znalezione zakresy, np. string-range(/, "XML", 2, 5)[1]
znajdzie pierwsze wystąpienie XML i zwróci "ML???" gdzie znaki ? to kolejne litery
po tym wystąpieniu (czyli "ML4 i" z poprzedniego przykładu).
- Ja nie wiem po co jest ta funkcja
XPointer w dokumencie: range-to
Zapytanie: xpointer(//doc/para[2]/range-to(para[3])
Dokument z zaznaczonym wynikiem:
<?xml version="1.0"?>
<doc>
<para>...</para>
<para>
<title>...</title>
<para/>
<para/>
</para>
<para>...</para>
</doc>
XPointer w dokumencie: string-range
Zapytanie: xpointer(string-range(//*, "and")
Dokument z zaznaczonym wynikiem:
<?xml version="1.0"?>
<doc>
<para>
...
</para>
</para>
... Cow and Chicken ..
<para>
... and ....
</para>
</doc>
XML-Base
- Prościutki standard, definiuje tylko jeden element xml:base
- Znamy się na XML-Names stąd wyjaśnienie: prefiks xml nie ma przypisanego URLa,
jest zarezerwowany przez standard XML-Names
- Określa też sposób wyznaczania URLi: priotytet atrybutu nad URL dokumentu
- Bazowe URLe określane przez xml:base są do wykorzystania przez
różne standardy
Przykład XML-Base
Dokument http://karolb.prv.pl/test-doc.xml (ważne!):
<?xml version="1.0"<?
<doc>
<a href=doc2.xml">link</a>
<sub xml:base="subdir/">
<a href=doc2a.xml" xlink:type="simple" xlink:href="doc2a.xml">click</a>
</sub>
</doc>
Pierwszy link oznacza http://karolb.prv.pl/doc2.xml a drugi
http://karolb.prv.pl/subdir/doc2a.xml.
Oprócz linków XHTMLowych w przykładzie jest też XLink.
XLink
- XLink to sposób wyrażania linków w dowolnym dokumencie XMLowym
- Przestrzeń nazw http://www.w3.org/1999/xlink oznaczam przez xlink
- XLink nie definiuje żadnych nazw elementów
- Zamiast tego XLink definiuje atrbuty, które nadają znaczenie elementom
- XLinki mogą wiązać wiele zasobów (niekonicznie dwa)
- XLinki nie mają kierunku
- Można definiować XLinki w zewnętrznym pliku
XLink - c.d.
Po co linki w zewnętrzych plikach?
- Nie do wszystkich plików mamy dostęp
- Nie we wszystkich da się umieścić link (np. w jpegu się nie da)
Po co linki między wieloma zasobami?
- A czemu się ograniczać do dwóch?
Dla konserwatystów: xlink może wyglądać tak <elt xlink:type="simple"
xlink:href="http://karolb.prv.pl">Visit me!<elt>, ale na razie
o tym zapominamy.
Główne pojęcia w XInclude
Teraz mówimy o linkach rozszerzonych (ang. extended)
- link ma typ extended
- link wiąże zasoby: zdalne i/lub lokalne
- zdalne (ang. remote) zasoby (te z innych plików)
są reprezentowane przez lokatory (ang. locators)
- zasób lokalny (ang. local) to element dziecko elementu stanowiącego link
- zasoby w linkach magą mieć role - informacja semantyczna do przetwarzania
- oraz nazwy - dla człowieka
Przykład prostego linku
<courseload
xlink:type="extended"
xmlns:xlink="http://www.w3.org/1999/xlink">
<tooltip
xlink:type="title">Course Load for Pat Jones</tooltip>
<person
xlink:type="locator"
xlink:href="students/patjones62.xml"
xlink:label="student62"
xlink:role="http://www.example.com/linkprops/student"
xlink:title="Pat Jones" />
<person
xlink:type="locator"
xlink:href="profs/jaysmith7.xml"
xlink:label="prof7"
xlink:role="http://www.example.com/linkprops/professor"
xlink:title="Dr. Jay Smith" />
<course
xlink:type="locator"
xlink:href="courses/cs101.xml"
xlink:label="CS-101"
xlink:title="Computer Science 101" />
<gpa
xlink:type="resource"
xlink:label="PatJonesGPA">3.5</gpa>
<!-- następny przykład to będzie ten fragment -->
</courseload>
Kilka wyjaśnień
- nazwy elementów (person, course) definiuje twórca dokumentu, XLink nie
narzuca żadnych ograniczeń
- elementy person to lokatory
- element gpa (grade point avarage) to zasób lokalny
- tooltip to nazwa całego linku
- oprócz tego każdy zasób ma swoją nazwę (xlink:title)
- etykiety zasobów (xlink:label) przydadzą się zaraz
- rola oznacza zbaczenie zasobu w linku; interpretacja ról nie jest określona
Łuki i przejścia
- xlink łączy zasoby (było)
- oraz podaje sposób na przechodzenie od jednego do drugiego
- przejście (ang. traversal) to użycie linku
- łuk (ang. arc) to definicja tego przejścia: kierunek i
zachowanie aplikacji przy przejściu przez link
- przejście jest zawsze od zasobu źródłowego do docelowego
- to łuk określa, który zasób jest źródłowy, a który docelowy
Przykład kodu (łuki)
Poniższy kod to uzupełnienie xlinku sprzed trzech slajdów.
<go
xlink:type="arc"
xlink:from="student62"
xlink:to="PatJonesGPA"
xlink:show="new"
xlink:actuate="onRequest"
xlink:title="Pat Jones's GPA" />
<go
xlink:type="arc"
xlink:from="CS-101"
xlink:arcrole="http://www.example.com/linkprops/auditor"
xlink:to="student62"
xlink:show="replace"
xlink:actuate="onRequest"
xlink:title="Pat Jones, auditing the course" />
<go
xlink:type="arc"
xlink:from="student62"
xlink:arcrole="http://www.example.com/linkprops/advisor"
xlink:to="prof7"
xlink:show="replace"
xlink:actuate="onRequest"
xlink:title="Dr. Jay Smith, advisor" />
Parę wyjaśnień
- elementy go to łuki
- atrybuty xlink:from oraz xlink:to wskazują na etykietę
(label)
- etykiety nie muszą być unikalne więc jeden łuk może tworzyć wiele połączeń
- role łuków to co innego niż role zasobów: to stosunek celu do źródła przejścia
- xlink:show wskazuje na sposób wyświetlania dokumentu po przejściu przez łuk,
dozwolone wartości: show, new, embed, other, none
- xlink:actuate mówi kiedy wykonać przejście przez łuk,
dozwolone wartości: onLoad, onRequest,other, none
Ładny przykład na etykiety
<extendedlink xlink:type="extended">
<loc xlink:type="locator" xlink:href="..." xlink:label="parent" xlink:title="mother" />
<loc xlink:type="locator" xlink:href="..." xlink:label="parent" xlink:title="father" />
<loc xlink:type="locator" xlink:href="..." xlink:label="child" xlink:title="daughter" />
<loc xlink:type="locator" xlink:href="..." xlink:label="child" xlink:title="son 1" />
<loc xlink:type="locator" xlink:href="..." xlink:label="child" xlink:title="son 2" />
<go xlink:type="arc" xlink:from="parent" xlink:to="child" />
</extendedlink>
Tutaj jeden łuk go generuje przejścia od każdego z rodziców do wszystkich dzieci
Jak interpretować XLinki?
Przykład na potrzeby WWW.
Znowu XLink prosty
Odpowiedniość między linkami prostymi a rozszerzonymi.
<studentlink xlink:href="...">Pat Jones</studentlink>
Powyżej prosty, poniżej rozszerzony.
<studentlink xlink:type="extended">
<resource
xlink:type="resource"
xlink:label="local">Pat Jones</resource>
<locator
xlink:type="locator"
xlink:href="..."
xlink:label="remote"
xlink:role="..."
xlink:title="..." />
<go
xlink:type="arc"
xlink:from="local"
xlink:to="remote"
xlink:arcrole="..."
xlink:show="..."
xlink:actuate="..." />
</studentlink>
XInclude
- XInclude definiuje sposób włączania plików
- jest to włączanie XMLa do XMLa
- definiuje jeden element <xi:include> z
parametrami href, parse oraz encoding
- nowa wersja dodaje jeszcze element <xi:fallback>
- xi to prefiks na oznaczenie "http://www.w3.org/2001/XInclude"
- wykorzystuje XML-Names, XML-Base, XPointer
Przykład włączania 1: xml i text
Dokument źródłowy:
<doc>
<xi:include src="inc1.xml" parse="xml"/>
<after-first-incl/>
<xi:include src="inc1.xml" parse="text"/>
after-all
</doc>
Plik inc1.xml:
<inc>
<b>inc</b>luded
</inc>
Wynik:
<doc>
<inc>
<b>inc</b>luded
</inc>
<after-first-incl/>
<inc>
<b>inc</b>luded
</inc>
after-all
</doc>
Przykład włączania 2: xpointer
Dokument źródłowy:
<doc>
<xi:include src="inc2.xml@#xpointer(//para)" parse="xml"/>
</doc>
Plik xml1.xml:
<inc>
<title>a title<title>
<para>paragraph 1<para>
<para>paragraph 2<para>
</inc>
Wynik:
<doc>
<para>paragraph 1<para>
<para>paragraph 2<para>
</doc>
Mój program
- implementuje XInclude, a więc i XPointer
- bazuje na XPath z Saxona
- wykorzystuje Java'owy model dostępu do dokumentów: SAX
Dlaczego to nie program na 3 dni?
- muszę napisać parser XPointera (ale w oparciu o XPath)
- jest ścisła specyfikacja (to ma wady ale i zalety)
- są kruczki: dodatkowe atrybuty xmlns* i xml:base,
wykrywanie cykli
- oprogramowanie z którego korzystam ma błędy (normalna sprawa)
Czy się tego używa?
Tak.
- zaawansowane systemy zarządzania treścią (np. X2X)
- zapewne wiele innych, są linki na w3.org
- w mojej firmie do dokumentacji w DocBooku można wstawiać xlinki,
które są renderowane do list rozwijanych w JavaScript'cie
- Cocoon
TopicMaps
- definiuje standard przechowywania i wymiany informacji o pojęciach
- TopicMaps to standard ISO, ma implementację w XMLu: XTM
- wywodzi się z prac nad indeksowaniem danych encyklopedycznych
- to próba nadania danym semantyki, tak by było łatwo ją wyszukiwać
Podmiot (ang. subject)
- podmiotem może być każde pojęcie, to człowiek decyduje co jest podmiotem
- są dwa rodzaje podmiotów: adresowalne i nieadresowalne
- adresowalne to te, które mogą być dostępne dla komputera
- pozostałe to nieadresowalne
- Przykłady
- wersja elektroniczna tego dokumentu
- William Shakespeare
- Hamlet (jako sztuka lub jako osoba)
- jakieś określone papierowe wydanie Hamleta
- seks
Temat (ang. topic)
- temat to materializacja (ang. reification - uściślenie) podmiotu
- każdy temat dotyczy jakiegoś podmiotu
- właściwości (ang. characteristics) tematu: nazwa,
wystąpienia (ang. occurences), role grane w związkach (ang. assotiations)
- tematy należą do klas
- w TopicMaps "wszystko jest tematem": klasa tematu to temat, związek między tematami
to też temat, itd
Temat w składni XTM
<topic id="hamlet">
<instanceOf><topicRef xlink:href="#play"/></instanceOf>
<baseName>
<baseNameString>Hamlet, Prince of Denmark</baseNameString>
</baseName>
<occurrence>
<instanceOf><topicRef xlink:href="#plain-text-format"/></instanceOf>
<resourceRef
xlink:href="ftp://www.gutenberg.org/pub/gutenberg/etext97/1ws2610.txt"/>
</occurrence>
</topic>
- ten temat nie ma wskazanego tematu
- jego klasa to play, która jest tematem w tym samym dokumencie
Jak zdefiniować podmiot?
- jeżeli jest adresowalny to podać adres
- jeżeli nie jest to tworzy się zasób adresowalny (jakiś temat), który
jednoznacznie identyfikuje podmiot
- taki zasób to wkaźnik tematu (ang. subject indicator)
- każdy może sobie taki zasób stworzyć
- żeby wymieniać informację tworzy się publiczne wskaźniki i je ogłasza
- np. http://www.topicmaps.org/xtm/1.0/country.xtm#pl to publiczny wskaźnik na Polskę
Tak wygląda temat Polska (dla ciekawych)
<topic id="PL">
<instanceOf><topicRef xlink:href="#country-name"/></instanceOf>
<baseName><scope><topicRef xlink:href="#alpha2"/></scope>
<baseNameString>PL</baseNameString></baseName>
<baseName><scope><topicRef xlink:href="#alpha3"/></scope>
<baseNameString>POL</baseNameString></baseName>
<baseName><scope><topicRef xlink:href="language.xtm#en"/></scope>
<baseNameString>Poland</baseNameString></baseName>
<baseName><scope><topicRef xlink:href="language.xtm#en"/>
<topicRef xlink:href="#uppercase"/></scope>
<baseNameString>POLAND</baseNameString></baseName>
</topic>
<topic id="country-name">
<instanceOf><topicRef xlink:href="core.xtm#class"/></instanceOf>
<subjectIdentity>
<subjectIndicatorRef xlink:href="#country-code-desc"/>
</subjectIdentity>
<baseName>
<scope><topicRef xlink:href="language.xtm#en"/></scope>
<baseNameString>ISO Country Code</baseNameString>
<variant>
<parameters>
<topicRef xlink:href="language.xtm#en"/>
<topicRef xlink:href="core.xtm#display"/>
</parameters>
<variantName>
<resourceRef xlink:href="#country-code-desc"/>
</variantName>
</variant>
</baseName>
<occurrence>
<resourceData id="country-code-desc">
ISO Country Code: a code representing the name of a country or country
subdivision, as listed in the ISO standard for country codes.
</resourceData>
</occurrence>
</topic>
Trzy sposoby powiedzenia, że temat dotyczy podmiotu
- jest zawarte w elemencie <subjectIdentity>, dziecku elementu topic
- podanie innego tematu, który dotyczy tego samego podmiotu
(za pomocą <topicRef>)
- podanie samego zasobu (<subjectIdentity>), jest możliwe tylko
przy podmiotach adresowalnych
- podanie wskaźnika do podmiotu (za pomocą <subjectIdenticatorRef>),
najlepiej gdy to wskaźnik publiczny
Przykłady
<topic id="dk">
<subjectIdentity>
<subjectIndicatorRef
xlink:href="http://www.topicmaps.org/xtm/1.0/country.xtm#dk"/>
</subjectIdentity>
</topic>
<topic ...>
<subjectIdentity>
<topicRef
xlink:href="http://www.topicmaps.org/xtm/1.0/language.xtm#en"/>
...
</topic>
<topic ...>
<subjectIdentity>
<resourceRef
xlink:href="ftp://www.gutenberg.org/pub/gutenberg/etext97/1ws2610.txt"/>
...
</topic>
Wystąpienie (ang. occurrence)
- To odnośniki do adresowalnych zasobów dotyczących podmiotu.
- Są zapisywane w tematach.
- Jeden temat może mieć wiele wystąpień
<topic id="hamlet">
...
<occurrence>
<instanceOf><topicRef xlink:href="#plain-text-format"/></instanceOf>
<resourceRef
xlink:href="ftp://www.gutenberg.org/pub/gutenberg/etext97/1ws2610.txt"/>
</occurrence>
...
</topic>
Związek (ang. association)
- Semantycznie między podmiotami
- Ale zapisywany oczywiście w tematach
- instanceOf to predefiniowany związek
<association>
<instanceOf><topicRef xlink:href="#written-by"/></instanceOf>
<member>
<roleSpec><topicRef xlink:href="#author"/></roleSpec>
<topicRef xlink:href="#shakespeare"/>
</member>
<member>
<roleSpec><topicRef xlink:href="#work"/></roleSpec>
<topicRef xlink:href="#hamlet"/>
</member>
</association>
Scalanie (ang. merging)
- po to są mapy by je scalać
- z dwóch map robi się jedną
- scalanie to utożsamianie tych samych tematów, podmiotów,
związków, wystąpień
- można między sobą wymieniać dane
- do tego jednak warto korzystać z publicznych identyfikatorów podmiotów
- mapa to element topicMap
Do poczytania