XSLT предназначен для обработки деревьев узлов XML. Хотя существуют сериализации RDF, которые представляют собой «дерево» узлов XML (RDF / XML и RDF / XML-Abbrev), базовой моделью данных RDF является граф.
Если ваш результирующий RDF-график также не является деревом, вам придется делать грязные вещи в вашем XSLT, чтобы проходить по ссылкам, и может пострадать производительность / ремонтопригодность / здравомыслие. Просто помните об этом, если вы измените формат OWL, а затем захотите преобразовать его обратно в XML без RDF.
Простой (древовидный) пример выглядит следующим образом:
## Foo has two types
@prefix e: <uri://example#>.
e:Foo a e:Bar.
e:Foo a e:Baz. # Second statement about e:Foo
Для преобразований обратно в XML без RDF, если вы используете самую основную форму RDF / XML, вы получите список операторов RDF непосредственно под элементом rdf:RDF
верхнего уровня. Их преобразование может включать поиск по всему списку операторов снова и снова.
<rdf:RDF xmlns:e="uri://example#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="uri://example#Foo">
<rdf:type rdf:resource="uri://example#Baz"/>
</rdf:Description>
<rdf:Description rdf:about="uri://example#Foo">
<rdf:type rdf:resource="uri://example#Bar"/>
</rdf:Description>
</rdf:RDF>
Вам может показаться, что формат RDF / XML-Abbrev проще для чтения, но с XSLT его нелегко обработать, поскольку модель данных RDF неупорядочена и один граф может иметь много эквивалентных (но несовместимых с вашими XSLT) XML-форм. В приведенном выше примере можно сериализовать одно из следующих:
<!-- Bar is the containing element -->
<rdf:RDF xmlns:e="uri://example#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<e:Bar rdf:about="uri://example#Foo">
<rdf:type rdf:resource="uri://example#Baz"/>
</e:Bar>
</rdf:RDF>
<!-- Baz is the containing element -->
<rdf:RDF xmlns:e="uri://example#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<e:Baz rdf:about="uri://example#Foo">
<rdf:type rdf:resource="uri://example#Bar"/>
</e:Bar>
</rdf:RDF>
Предложение Пита Киркхема о создании канонической формы для сериализации поможет вам в написании XSLT. В большинстве случаев при одинаковых входных данных библиотека RDF будет сериализовать операторы в один и тот же формат каждый раз, но я не буду зависеть от этого в долгосрочной перспективе, поскольку данные в графе RDF неупорядочены.