所以我提供了一个大的XML文档。我必须编写一个查询,给定一个类名和本体名称,将计算一个本体视图,其中包含与该类相关的文档的本体部分。更准确地说,我需要选择类的子类,实例和与类相关的规则。我想要递归地做这件事。
知道如何轻松完成这项工作?
答案 0 :(得分: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>
您可以轻松地调整此函数以返回相应类的规则和实例。