如何在eXist-db中使用XQuery和/或XSLT从我的XML创建SVG中的条形图

时间:2014-03-09 14:32:57

标签: xpath svg xquery exist-db

我找不到任何现有的解决方案,因为我认为还没有其他人使用过eXist-db来做到这一点。有没有人知道如何使用eXist-db中的SVG绘制条形图?

首先约会:

DTD:

<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT akweny (akwen+)>
<!ELEMENT akwen (nazwa, typ, powierzchnia, akweny?)>
<!ELEMENT nazwa (#PCDATA)>
<!ELEMENT typ (#PCDATA)>
<!ELEMENT powierzchnia (#PCDATA)>

以XML为例:

<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE akweny SYSTEM "akweny.dtd">
    <akweny>
        <akwen>
            <nazwa>Atlantycki</nazwa>
            <typ>ocean</typ>
            <powierzchnia>106450</powierzchnia>
            <akweny>
                <akwen>
                    <nazwa>Północne</nazwa>
                    <typ>morze</typ>
                    <powierzchnia>750</powierzchnia>
                </akwen>
                <akwen>
                    <nazwa>Batyckie</nazwa>
                    <typ>morze</typ>
                    <powierzchnia>386</powierzchnia>
                    <akweny>
                        <akwen>
                            <nazwa>Botnicka</nazwa>
                            <typ>zatoka</typ>
                            <powierzchnia>117</powierzchnia>
                        </akwen>
                    </akweny>
                </akwen>
            </akweny>
        </akwen>
        <akwen>
            <nazwa>Spokojny</nazwa>
            <typ>ocean</typ>
            <powierzchnia>179700</powierzchnia>
        </akwen>
    </akweny>

我知道eXist-db有一些XSLT转换功能,例如

transform:stream-transform($node-tree as node()*, $stylesheet as item(), 
$parameters as node()?) as item()

但我怎么能用这个呢?我找不到任何例子。我不知道如何使用它......

这是我的链接:

bars.xq?nazwa=anyNazwa&typ=anyTyp&powierzchnia=100

它应该显示nazwa中的任意一个,typ中的任何powierzchnia以及100的{​​{1}}。

这是我简单的XQuery

let $nodes := doc('/db/Dane/akweny.xml')//akweny[ancestor::akwen/nazwa=request:get-parameter("nazwa", ()) and typ=request:get-parameter("typ", ())]
        for $x in $nodes/* 
        let $nazwa := $x/nazwa/text()
        let $typ := $x/typ/text()
        let $powierzchnia := $x/powierzchnia/text()
            where $powierzchnia >= number(request:get-parameter("powierchnia", ()))

我的问题是:

如何以条形图的形式显示所选节点的所有子节点:nazwatyppowierchnia

2 个答案:

答案 0 :(得分:5)

以下是在纯XQuery中执行此操作的示例,这将在eXist或任何其他XQuery 1.0处理器中运行:

declare variable $local:max-graph-height := 400; (: pixels :)
declare variable $local:graph-bar-width := 120; (: pixels :)
declare variable $local:graph-bar-spacing := 10; (: pixels :)
declare variable $local:graph-text-below := 20; (: pixels :)

let $awkeny := doc("/db/Dane/akweny.xml")//akwen[xs:int(powierzchnia) gt 100]
let $max-powierzchnia := max($awkeny/powierzchnia)

return

    <svg xmlns="http://www.w3.org/2000/svg" 
        xmlns:xlink="http://www.w3.org/1999/xlink" 
        id="graph"
        height="{ $local:max-graph-height + ($local:graph-text-below * 2) }" 
        width="{ ($local:graph-bar-width + $local:graph-bar-spacing) * count($awkeny) }">

        <linearGradient x1="0%" x2="0%" y1="10%" y2="100%" id="gradient">
            <stop style="stop-color:#0000FF" offset="0"></stop>
            <stop style="stop-color:#FFFFFF" offset="1"></stop>
        </linearGradient>

        {
        for $awken at $i in $awkeny
        let $height := (xs:float($awken/*:powierzchnia) div $max-powierzchnia) * $local:max-graph-height
        let $x := ($i - 1) * ($local:graph-bar-with + $local:graph-bar-spacing)
        let $y := $local:max-graph-height - $height
        return
            (
            <rect width="{$local:graph-bar-with}" 
                height="{$height}" x="{$x}" y="{$y}" 
                fill="url(#gradient)"></rect>,
            <text x="{$x}" 
                y="{$local:max-graph-height + $local:graph-text-below}" 
                fill="red">{$awken/*:nazwa/text()}</text>
            )
        }
    </svg>

在awkeny.xml上运行上面的XQuery会在SVG中生成一个如下所示的条形图:SVG Bar Chart of awkeny.xml generated from XQuery

现在我认为您只需要在eXist中使用XQuery,就像您从示例中看到的那样从传入的HTTP请求中获取参数,但是我可以从您的问题中看出您已经知道如何做到这一点。所以你现在应该顺利去...

答案 1 :(得分:1)

您可以查看eXist-db jfreechart扩展程序:

https://github.com/eXist-db/jfreechart

指定图像类型svgz时,会生成压缩的SVG文件。 GitHub和eXist-db软件包管理器(公共存储库)都提供了预编译的XAR文件(包括一个简单的演示)