跳转到内容

XQuery/调用图

来自 Wikibooks,开放世界中的开放书籍

您有很多 XQuery 函数和模块,并且您希望通过生成一个显示函数之间调用关系的图表来了解它们之间的调用关系。

示例单个模块调用图

[编辑 | 编辑源代码]

以下是单个模块的调用图示例。

示例单个 XQuery 模块调用的调用图。每个圆形节点都是一个函数。连接节点的线表示一个函数调用另一个函数。
  • 您可以快速查看哪些函数不调用其他函数且从未被调用(孤立函数)。
  • 有些函数调用其他函数,但不会被该模块中的其他函数调用。
  • 有些函数被认为是叶子函数,因为它们不调用除标准 XQuery 库函数之外的任何其他函数。
  • 有些函数被其他函数多次调用。这些是实用程序模块的理想候选者。
  • 有些函数只被调用一次。如果是这种情况,您就会知道如果它发生变化,该模块中函数的影响。
  • 带有指向自身的箭头函数是递归函数

以下是一个模块之间调用图的示例

示例 XQuery 模块调用的调用图。每个模块都在一个矩形中,每个函数都在一个圆圈中。两个节点之间的链接表示对另一个函数的调用。

我们可以使用 inspect 模块提取模块的调用信息

eXist 站点上的 Inspect 模块

或者,如果您已将文档本地安装到桌面或笔记本电脑上:本地 eXist 文档

inspect 函数将返回一个类似这样的结构

<module uri="http://docbook.org/ns/docbook" prefix="docbook" location="/db/apps/doc/modules/docbook.xql">
    <function name="docbook:load" module="http://docbook.org/ns/docbook">
    ...
      <calls>
         <function name="dq:do-query" module="http://exist-db.org/xquery/documentation/search" arity="3"/>
       </calls>
    </function>
</module>

我们希望将其可视化,如上图所示。

示例图形标记语言

[编辑 | 编辑源代码]
<!-- sample XQuery call graph with two modules.
    Module A has three functions, a, b, and c where a calls b and c.
    Module B has three functions d, e, and f where b calls e and f.
    a also calls d which must be placed outside and after the module clusters.
    -->
<graph xmlns="http://www.martin-loetzsch.de/DOTML"  rankdir="LR" bgcolor="silver">
    <cluster id="m1" bgcolor="yellow" label="module A">
        <!-- each function within a module is a node -->
        <node id="m1a" label="a"/>
        <node id="m1b" label="b"/>
        <node id="m1c" label="c"/>
        <!-- each call to another function generates an edge -->
        <edge from="m1a" to="m1b"/>
        <edge from="m1a" to="m1c"/>   
    </cluster>
    
    <cluster id="m2" bgcolor="pink"  label="module B">
        <!-- each function within a module is a node -->
        <node id="m2d" label="d"/>
        <node id="m2e" label="e"/>
        <node id="m2f" label="f"/>
        <!-- each call to another function generates an edge -->
        <edge from="m2d" to="m2e"/>
        <edge from="m2d" to="m2f"/>
    </cluster>
    
    <!-- inter module calls must be placed AFTER the modules themselves -->
    <edge from="m1c" to="m2d"/>
</graph>

GraphViz 是一个非常成熟的节点布局系统,具有许多复杂的功能和非 XML 输入格式。

  • 如果 GraphViz 管道中存在错误,则几乎没有反馈信息。我们应该使用 try/catch 来获取有关错误的更多反馈。
  • Dot 语言在 ID 中不接受“破折号”(-)或冒号(:)字符。如果它们出现,转换将简单地不返回任何结果,而不会出现错误消息。这些字符必须从 ID 中删除,并且必须使用“label”属性来显示节点上的值。
  • 理想情况下,应该有一个单一的 XQuery typeswitch 转换来执行转换为 SVG,但准确放置图中的节点是一个复杂的过程。
  • 应该有一些方法来调整转换位置,例如提示将类似函数名称分组在一起。
  • 应该有一些方法来保持此系统在使用 XQDoc 的 XML 开发工具之间可移植。这取决于 XQDoc 工具是否导出正确的信息。
华夏公益教科书