1

我需要在 Java 中从 XMI 转换为 OWL(XML/RDF 序列化),所以本质上这是 XML 到 XML 的转换,很可能我可以使用正则表达式并使用 replaceAll 来满足我的需要,但这似乎很混乱它。您有什么建议以便以后可以轻松定制(我的 OWL 模型将来可能会略有变化)?

我的想法是将 XMI 读入创建的类层次结构(根据我的 OWL 模型),然后使用一些模板引擎将其输出为 OWL (XML)。您知道可以轻松定制的更简单的方法吗?

4

5 回答 5

4

XSL Transformations非常适合这种工作,事实上它就是为它设计的 :-)

要开始使用 XSLT,请查看zvon 参考及其教程。

于 2010-01-09T10:21:05.607 回答
2

您可以使用 XSLT 将 XML 转换为 XML。

这篇OReilly文章是一个很好的起点。

于 2010-01-09T10:21:10.380 回答
1

XMI 不是直接转换为 OWL 的一种很好的格式 - XMI 中有许多不同的结构,它们具有相同的含义(@stereotype="foo", stereotype/@name="foo",并且stereotype/@xmi:id="{id of the foo stereotype}"都表示相同的意思) - 我强烈建议使用 XMI 优先的两阶段过程转换为规范形式,其中此类引用被解析,并且您不想映射到 OWL 的任何信息都被删除。

如果您不熟悉XSLT 键功能和元素,它将证明是有用的。尽管您可以在 XSLT1 中执行此操作(当没有其他可用时我也这样做了),但在诸如Saxon之类的 XSLT2 处理器中工作会使转换更加简洁。询问 XSLT 问题的最佳位置是Mulberry 列表

sourceforge 上有一个工具可以通过 GUI 执行此操作,但我似乎找不到它。我的中间转换由以前的雇主所有。对于代码生成或 XMI 到 XML,我直接使用 XSLT 和两阶段方法。

于 2010-01-09T11:00:20.970 回答
0

XSLT 是为处理 XML 节点树而设计的。虽然有一些 RDF 序列化是 XML 节点的“树”(RDF/XML 和 RDF/XML-Abbrev),但底层 RDF 数据模型是一个图。

如果生成的 RDF 图也不是树,那么您将不得不在 XSLT 中做一些肮脏的事情来遍历引用,并且性能/可维护性/健全性可能会受到影响。如果您修改 OWL 格式然后想要转换回非 RDF XML,请注意这一点。

一个简单的(树)示例如下:

## 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>

Pete Kirkham 提出的为序列化创建规范形式的建议将有助于您编写 XSLT。在大多数情况下,给定完全相同的输入,RDF 库每次都会将语句序列化为相同的格式,但从长远来看,我不会依赖这一点,因为 RDF 图中的数据是无序的。

于 2010-01-09T17:15:05.227 回答
0

我同意 rsp 和 cb160 的观点,即 XSLT 是完成这项工作的工具。

如果您使用的是 unix 平台,则可以考虑使用xsltproc在命令行上测试转换。根据我的经验,如果您不熟悉 XSL,这确实可以加快开发时间。

于 2010-01-09T10:26:26.773 回答