我需要在 Java 中从 XMI 转换为 OWL(XML/RDF 序列化),所以本质上这是 XML 到 XML 的转换,很可能我可以使用正则表达式并使用 replaceAll 来满足我的需要,但这似乎很混乱它。您有什么建议以便以后可以轻松定制(我的 OWL 模型将来可能会略有变化)?
我的想法是将 XMI 读入创建的类层次结构(根据我的 OWL 模型),然后使用一些模板引擎将其输出为 OWL (XML)。您知道可以轻松定制的更简单的方法吗?
我需要在 Java 中从 XMI 转换为 OWL(XML/RDF 序列化),所以本质上这是 XML 到 XML 的转换,很可能我可以使用正则表达式并使用 replaceAll 来满足我的需要,但这似乎很混乱它。您有什么建议以便以后可以轻松定制(我的 OWL 模型将来可能会略有变化)?
我的想法是将 XMI 读入创建的类层次结构(根据我的 OWL 模型),然后使用一些模板引擎将其输出为 OWL (XML)。您知道可以轻松定制的更简单的方法吗?
XSL Transformations非常适合这种工作,事实上它就是为它设计的 :-)
要开始使用 XSLT,请查看zvon 参考及其教程。
您可以使用 XSLT 将 XML 转换为 XML。
这篇OReilly文章是一个很好的起点。
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 和两阶段方法。
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 图中的数据是无序的。
我同意 rsp 和 cb160 的观点,即 XSLT 是完成这项工作的工具。
如果您使用的是 unix 平台,则可以考虑使用xsltproc在命令行上测试转换。根据我的经验,如果您不熟悉 XSL,这确实可以加快开发时间。