所以我得到了一个很大的 XML 文档。我必须编写一个查询,给定一个类名和本体名称,它将计算一个本体视图,其中包含与该类相关的文档的本体部分。更准确地说,我需要选择类的子类、实例以及与类相关的规则。我正在考虑递归地执行此操作。
知道如何轻松做到这一点吗?
您可以通过递归函数降低文档中定义的类层次结构:
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>
您可以轻松地调整此函数以返回相应类的规则和实例。