2

次の 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-root要素を解析し、 layout-chunkおよびlayout-structure要素とそれらの可能な子を解析し、DOT グラフで使用されるidおよびxref属性を返す最良の方法は何でしょうか?

私は XQuery のまったくの初心者で、さまざまなアプローチを試してきました。DOT に必要なマークアップを生成するには、各要素のid値とxref値を連結する必要があると思います。

4

2 に答える 2

1

DotML と呼ばれる Dot の XML 構文があります。DotML の生成は、Dot を直接生成するよりも簡単であることがわかりました。詳細はこちら:

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

于 2012-08-31T12:06:15.523 に答える
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),
'}')
于 2012-08-31T11:04:04.930 に答える