2

所以我得到了一个很大的 XML 文档。我必须编写一个查询,给定一个类名和本体名称,它将计算一个本体视图,其中包含与该类相关的文档的本体部分。更准确地说,我需要选择类的子类、实例以及与类相关的规则。我正在考虑递归地执行此操作。

知道如何轻松做到这一点吗?

4

1 回答 1

1

您可以通过递归函数降低文档中定义的类层次结构:

declare default element namespace "http://omdoc.org/ns";
declare namespace om = "http://www.openmath.org/OpenMath";

declare function local:class-hierarchy(
  $doc as document-node(),
  $classname as xs:string
) as node() {
  <class name='{$classname}'> {
    for $OMA in $doc//axiom/FMP/om:OMOBJ/om:OMA
    where $OMA/om:OMS[1]/@name = 'subclass'
      and $OMA/om:OMS[3]/@name = $classname
    return local:class-hierarchy($doc, $OMA/om:OMS[2]/@name)
  }</class>
};

该函数返回表示子类关系的嵌套元素。例如的子类Device可以计算如下:

let $doc := fn:doc("http://rasdaman.flanche.net/dbwa/Assignment5/example.omdoc"),
    $class := 'Device'
return local:class-hierarchy($doc, $class)

结果:

<class xmlns="http://omdoc.org/ns" name="Device">
  <class name="Camera">
    <class name="DSLR"/>
  </class>
</class>

您可以轻松地调整此函数以返回相应类的规则和实例。

于 2012-10-18T17:24:33.977 回答