如何在 eXist-db 中使用 XQuery 和/或 XSLT 从我的 XML 在 SVG 中创建条形图 [英] How do I create bar-charts in SVG from my XML using XQuery and/or XSLT in eXist-db
问题描述
我找不到任何现有的解决方案,因为我认为还没有其他人使用 eXist-db 来做到这一点.有人知道如何使用 eXist-db 中的 SVG 绘制条形图吗?
第一次约会:
DTD:
以 XML 为例:
我知道 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
中的任何一个并且大于 100
的 powierzchnia
.>
这是我的简单 XQuery
let $nodes := doc('/db/Dane/akweny.xml')//akweny[ancestor::akwen/nazwa=request:get-parameter("nazwa", ()) 和 typ=request:get-parameter("typ", ())]对于 $nodes/* 中的 $x让 $nazwa := $x/nazwa/text()让 $typ := $x/typ/text()让 $powierzchnia := $x/powierzchnia/text()其中 $powierzchnia >= number(request:get-parameter("powierchnia", ()))
我的问题是:
如何通过nazwa
、typ
和powierchnia
以条形图的形式显示所选节点的所有子节点?
以下是在纯 XQuery 中执行此操作的示例,这将适用于 eXist 或任何其他 XQuery 1.0 处理器:
声明变量 $local:max-graph-height := 400;(: 像素 :)声明变量 $local:graph-bar-width := 120;(: 像素 :)声明变量 $local:graph-bar-spacing := 10;(: 像素 :)声明变量 $local:graph-text-below := 20;(: 像素 :)让 $awkeny := doc("/db/Dane/akweny.xml")//akwen[xs:int(powierzchnia) gt 100]让 $max-powierzchnia := max($awkeny/powierzchnia)返回<svg xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"id="图形"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>{对于 $awken 在 $i 在 $awkeny让 $height := (xs:float($awken/*:powierzchnia) div $max-powierzchnia) * $local:max-graph-height让 $x := ($i - 1) * ($local:graph-bar-with + $local:graph-bar-spacing)让 $y := $local:max-graph-height - $height返回(<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 中生成一个条形图,如下所示:
现在我认为您只需要在 eXist 中将其添加到您的 XQuery 中,就像您从示例中显示的那样从传入的 HTTP 请求中获取参数,但是我可以从您的问题中看出您已经知道如何做到这一点.所以你现在应该一切顺利...
I can't find any existing solutions because I do not think that anybody else has used eXist-db to do this yet. Does anybody know how to draw bar charts using SVG from eXist-db?
Firstly date:
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)>
And XML for example:
<?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>
I know eXist-db has some XSLT transformation functions, e.g.
transform:stream-transform($node-tree as node()*, $stylesheet as item(),
$parameters as node()?) as item()
But how the hell can I use this? I can't find any examples. I don know how to use it...
Here is my link:
bars.xq?nazwa=anyNazwa&typ=anyTyp&powierzchnia=100
It should show Any of nazwa
, any of typ
and greater than powierzchnia
of 100
.
Here is my simple 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", ()))
My question is:
How to show all the children of the selected node by: nazwa
, typ
and powierchnia
in the form of a bar chart?
Here is an example of doing this in pure XQuery, this will work in eXist, or any other XQuery 1.0 processor:
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>
The above XQuery when run on your awkeny.xml produces a bar-chart in SVG that looks like the following:
Now I think you just need to work that into your XQuery in eXist as you appear from your example to be taking parameters from the incoming HTTP Request, however I can see from your question that you already know how to do that. So you should now be well on your way...
这篇关于如何在 eXist-db 中使用 XQuery 和/或 XSLT 从我的 XML 在 SVG 中创建条形图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!