1

次のXMLからDOTグラフを作成する必要があります。

<layout>
<layout-structure>
    <layout-root id="layout-root" orientation="landscape">
        <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-leaf xref="lay-1.03"/>
    </layout-root>
</layout-structure>
<realization>
    <text xref="lay-1.01"/>
    <text xref="lay-1.02"/>
    <graphics xref="lay-1.03 lay-1.04"/>
</realization>
</layout>

次のXQueryを使用してDOTマークアップを生成します。

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

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

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

let $doc := doc("layout-data.xml")/layout
let $root := $doc/layout-structure/*
return concat('graph "', $root/@id, '" { ', $newline, local:ref($root),'}')

上記のクエリは正常に機能し、次のグラフを生成します。

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

結果を以下に示します。

ここで、私がやりたいのは、以下に示すように、XMLの実現要素の下で定義されたプロパティに応じて、DOTグラフの各要素に一連のプロパティを割り当てることです。

もちろん、これには次のDOTマークアップが必要です。

graph "layout-root" {
"lay-1.03" [shape="box", style="filled", color="#b3c6ed"];
"lay-1.04" [shape="box", style="filled", color="#b3c6ed"]; 
"layout-root" -- "header-text";
"header-text" -- "lay-1.01";
"header-text" -- "lay-1.02";
"layout-root" -- "lay-1.03";
"layout-root" -- "lay-1.04";
}

必要なDOTマークアップを選択して書き込むために、2つの追加の変数と関数を記述しました。

declare variable $dotgraphics := '[shape="box", style="filled", color="#b3c6ed"]';

declare function local:gfx($doc) {
for $layout-leafs in $doc//layout-leaf
let $graphics := $doc/realization//graphics
where $graphics[contains(@xref, $layout-leafs/@xref)]
return concat($layout-leafs/@xref, ' ', $dotgraphics, ';', $newline)
};

私の問題は、関数local:gfxを上記の動作中のXQueryスクリプトに含めるにはどうすればよいですか?

以下に示すように、local:ref($ root)の前に関数* local:gfx($ doc)を呼び出すだけの場合、

return concat('graph "', $root/@id, '" { ', $newline, local:gfx($doc), $newline, local:ref($root),'}')

クエリは、複数のアイテムのシーケンスをconcat関数の引数にすることはできないというエラーを返します。どうすればこれを修正できますか?

4

1 に答える 1

1

これに使用できますfn:string-join($strings[, $separator])。これは、代わりに文字列をシーケンスとして受け取ります。2番目のパラメーターとして使用する場合$newline(デフォルトは空の文字列です)、改行も挿入されます。

string-join(('foo', 'bar', 'baz'), '&#10;')

収量

foo
bar
baz
于 2012-09-03T11:16:34.800 に答える