如何使用XQuery创建DOT图?

时间:2012-08-31 09:42:14

标签: xml xquery dot

我需要根据以下XML创建DOT图:

<layout-structure>
    <layout-root id="layout-root">
        <layout-chunk id="header-text">
            <layout-leaf xref="lay-1.01"/>
            <layout-leaf xref="lay-1.02"/>
        </layout-chunk>
        <layout-leaf xref="lay-1.03"/>
    </layout-root>
</layout-structure>

我想使用DOT可视化不同布局块布局 - 叶元素之间的依赖关系,这些元素使用 id 或 xref 属性,具体取决于元素类型。

我想要的结果在下面的DOT中给出:

graph "layout-root" {
"layout-root" -- "header-text";
"header-text" -- "lay-1.01";
"header-text" -- "lay-1.02";
"layout-root" -- "lay-1.03";
}

这会产生这个可视化图表:

使用XQuery解析 layout-chunk layout-structure 元素的 layout-root 元素的最佳方法是什么可能的孩子,并返回要在DOT图中使用的 id xref 属性?

我是XQuery的一个完整的新手,并尝试过各种方法;我想我需要在每个元素中连接 id xref 值,以便为DOT生成所需的标记。

2 个答案:

答案 0 :(得分:1)

以下查询可能有所帮助(使用BaseX和Saxon测试):

declare variable $nl := '&#10;';

declare function local:ref($root) {
  string-join((
    for $c in $root/layout-chunk
    return (
      concat('  "', $root/@id, '" -- "', $c/@id, '";', $nl),
      local:ref($c)
    ),
    local:leaf($root)), "")
};

declare function local:leaf($root) {
  for $c in $root/layout-leaf
  return concat('  "', $root/@id, '" -- "', $c/@xref, '";', $nl)
};

(: Alternative: let $doc := doc("doc.xml") :)
let $doc := document {
  <layout-structure>
      <layout-root id="layout-root">
          <layout-chunk id="header-text">
              <layout-leaf xref="lay-1.01"/>
              <layout-leaf xref="lay-1.02"/>
          </layout-chunk>
          <layout-leaf xref="lay-1.03"/>
      </layout-root>
  </layout-structure> }
let $root := $doc/layout-structure/*
return concat(
  'graph "', $root/name(), '" { ' , $nl,
  local:ref($root),
'}')

答案 1 :(得分:1)

Dot有一种XML语法,称为DotML。我发现生成DotML比直接生成Dot更容易。详情如下:

http://martin-loetzsch.de/DOTML/