我需要在Java中从XMI转换为OWL(XML / RDF序列化),所以基本上这是XML到XML的翻译,我最有可能只使用正则表达式并将replaceAll用于我需要的东西,但这看起来非常混乱这样做的方式。 您会建议什么,以便以后可以轻松定制(我的OWL模型将来可能会略有变化)?
我的想法是将XMI读入已创建的类层次结构(根据我的OWL模型),然后使用一些模板引擎将其输出为OWL(XML)。您是否知道可以轻松定制的更简单方法?
答案 0 :(得分:4)
XSL Transformations非常适合这种工作,事实上它是为它设计的: - )
要从XSLT开始,请查看zvon reference及其教程。
答案 1 :(得分:2)
您可以使用XSLT将XML转换为XML。
这篇OReilly文章是一个很好的起点。
答案 2 :(得分: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中做到这一点(我没有其他可用的时候),但在Saxon等XSLT2处理器中工作会使转换变得更加简洁。提出XSLT问题的最佳地点是Mulberry list。
sourceforge上有一个工具可以通过GUI完成,但我似乎无法找到它。我的中间变换由前雇主拥有。对于代码生成或XMI到XML,我直接使用XSLT和两阶段方法。
答案 3 :(得分:0)
我同意rsp和cb160,XSLT是这项工作的工具。
如果您使用的是unix平台,可以考虑xsltproc来测试命令行上的转换。根据我的经验,如果你不是真的在家里使用XSL,那么真的可以加快开发时间。
答案 4 :(得分: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图中的数据是无序的。