2010-01-09 3 views
1

Мне нужно перевести с XMI на OWL (сериализованный XML/RDF) на Java, поэтому, по сути, это перевод XML-XML и, скорее всего, я мог бы просто играть с регулярным выражением и использовать replaceAll для того, что мне нужно , но это кажется очень грязным способом сделать это. Что бы вы предложили, чтобы его можно было легко настроить позже (моя модель OWL может немного измениться в будущем)?XML-XML-перевод в Java

Моя идея состояла в том, чтобы прочитать XMI в созданную иерархию классов (в соответствии с моей моделью OWL), а затем с помощью некоторого механизма шаблонов вывести его как OWL (XML). Знаете ли вы более простой способ, который легко настраивается?

ответ

4

XSL Transformations идеально подходит для такого рода работы, на самом деле она предназначена для этого :-)

Чтобы начать с XSLT, посмотрите на zvon reference и его руководства.

2

Вы можете использовать XSLT для преобразования XML в XML.

Эта статья OReilly является хорошим местом для начала.

0

Я согласен с rsp и cb160 в том, что XSLT является инструментом для работы.

Если вы находитесь на платформе unix, вы можете рассмотреть xsltproc, чтобы проверить трансформации в командной строке. По моему опыту, это может ускорить время разработки, если вы действительно не дома с XSL.

1

XMI не очень хороший формат для прямого преобразования в OWL - есть много различных структур в XMI, которые имеют тот же смысл (@stereotype="foo", stereotype/@name="foo" и stereotype/@xmi:id="{id of the foo stereotype}" все это означает то же самое) - я настоятельно советую использовать двух- когда XMI сначала преобразуется в каноническую форму, где такие ссылки разрешены, и любая информация, которую вы не хотите отображать в OWL, удаляется.

XSLT key function and element окажется полезным, если вы его не знакомы. Хотя вы можете сделать это в XSLT1 (и я сделал, когда не было других доступных), работа в процессоре XSLT2, такой как Saxon, делает преобразование намного более кратким. Лучшим местом для запроса вопросов XSLT является Mulberry list.

Был на инструменте sourceforge, который сделал это через графический интерфейс, но я не могу найти его. Мои промежуточные преобразования принадлежат предыдущему работодателю. Для генерации кода или XMI для XML я использую XSLT напрямую и двухэтапный подход.

0

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 

Для преобразования обратно в не-RDF XML, если вы используете самые основные 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> 

предложение Пита Kirkham о создании канонической формы для серийного номера будет помощником вам в письменном виде XSLTs. В большинстве случаев, учитывая тот же ввод, библиотека RDF будет каждый раз сериализовывать операторы в один и тот же формат, но я бы не стал зависеть от этого в конечном счете, поскольку данные в графике RDF неупорядочены.

Смежные вопросы