简体   繁体   English

如何从xml数据创建svg(用于Exist-DB)

[英]How to create svg from xml data (for use in Exist-DB)

I have xml file like: 我有这样的xml文件:

<SWIAT>
<KRAINA_GEOG TYP="Pobrzeze">
    <NAZWA>Południowobałtyckie</NAZWA>
    <POWIERZCHNIA>19000</POWIERZCHNIA>
    <OPADY_MIN>400</OPADY_MIN>
    <OPADY_MAX>800</OPADY_MAX>
</KRAINA_GEOG>
<KRAINA_GEOG TYP="Nizina">
    <NAZWA>Środkowoeuropejska</NAZWA>
    <POWIERZCHNIA>540000</POWIERZCHNIA>
    <OPADY_MIN>400</OPADY_MIN>
    <OPADY_MAX>750</OPADY_MAX>
    <KRAINA_GEOG TYP="Nizina">
        <NAZWA>Holenderska</NAZWA>
        <POWIERZCHNIA>24915</POWIERZCHNIA>
        <OPADY_MIN>550</OPADY_MIN>
        <OPADY_MAX>700</OPADY_MAX>
    </KRAINA_GEOG>
    <KRAINA_GEOG TYP="Nizina">
        <NAZWA>Południowowielkopolska</NAZWA>
        <POWIERZCHNIA>17000</POWIERZCHNIA>
        <OPADY_MIN>500</OPADY_MIN>
        <OPADY_MAX>650</OPADY_MAX>
        <KRAINA_GEOG TYP="Kotlina">
            <NAZWA>Szczercowska</NAZWA>
            <POWIERZCHNIA>1203</POWIERZCHNIA>
            <OPADY_MIN>500</OPADY_MIN>
            <OPADY_MAX>600</OPADY_MAX>
        </KRAINA_GEOG>
        <KRAINA_GEOG TYP="Rownina">
            <NAZWA>Rychwalska</NAZWA>
            <POWIERZCHNIA>1186</POWIERZCHNIA>
        </KRAINA_GEOG>
    </KRAINA_GEOG>
</KRAINA_GEOG>

And I want to make SVG bar chart with values from <POWIERZCHNIA> . 我想用<POWIERZCHNIA>值制作SVG条形图。 How to do this? 这个怎么做? I want to use it in Exist- db. 我想在Exist-db中使用它。 Any ideas? 有任何想法吗? Thanks for help. 感谢帮助。

You can generate SVG using XSLT, although you might find some chart library that might not require that you learn XSLT. 您可以使用XSLT生成SVG,尽管您可能会发现某些图表库可能不需要学习XSLT。 With XSLT you select the nodes you want using XPath, and can manipulate them any way you like. 使用XSLT,您可以选择要使用XPath的节点,并可以按照自己喜欢的任何方式进行操作。 You can even generate it dynamically on-the-fly in browsers (there are version limitations, though). 您甚至可以在浏览器中动态动态生成它(尽管有版本限制)。

I wrote a tutorial about SVG chart generation using XSLT 1.0. 我编写了有关使用XSLT 1.0生成SVG图表的教程。 Unfortunately it's in Portuguese and I never had the time to translate it. 不幸的是它是葡萄牙语的,而我却没有时间翻译它。 But I adapted your source XML and wrote a small XSLT stylesheet that will generate a simple SVG bar chart with the numbers in all POWIERZCHNIA field (not considering the nesting). 但是我修改了您的源XML,并编写了一个小的XSLT样式表,该样式表将生成一个简单的SVG条形图,其中所有POWIERZCHNIA字段中的数字都为数字(不考虑嵌套)。

I defined some variables with fixed values for the dimensions. 我为尺寸定义了一些具有固定值的变量。 The $max-powierzchnia variable selects the largest value which will be used to calculate the length of the bar using the value in POWIERZCHNIA * $max-bar-length / $max-powierzchnia . $max-powierzchnia变量使用POWIERZCHNIA * $max-bar-length / $max-powierzchnia值选择将用于计算POWIERZCHNIA * $max-bar-length / $max-powierzchnia The SWIAT XSL template defines the root elements of the SVG, then sorts in (by descending order of POWIERZCHNIA ) and processes all the KRAINA_GEOG nodes, which are transformed in the KRAINA_GEOG template. SWIAT XSL模板定义SVG的根元素,然后进行排序(按POWIERZCHNIA的降序排列)并处理所有在KRAINA_GEOG模板中转换的KRAINA_GEOG节点。

This is the stylesheet: 这是样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"
    version="1.0">

    <xsl:output indent="yes"/>

    <xsl:variable name="svg-width" select="1200" />
    <xsl:variable name="svg-height" select="900" />
    <xsl:variable name="max-bar-length" select="$svg-width - 400" />

    <xsl:variable name="bar-height" select="20" />
    <xsl:variable name="bar-spacing" select="10" />
    <xsl:variable name="bar-start" select="200" />

    <xsl:variable name="max-powierzchnia" select="//POWIERZCHNIA[not(. &lt; //POWIERZCHNIA)]" />

    <xsl:template match="SWIAT">
        <svg viewBox="0 0 {$svg-width} {$svg-height}" width="{$svg-width}px" height="{$svg-height}px">
            <g id="bar-chart" font-size="16" transform="translate(20,100)">
                <xsl:apply-templates select="//KRAINA_GEOG">
                    <xsl:sort order="descending" select="POWIERZCHNIA" />
                </xsl:apply-templates>
            </g>
        </svg>
    </xsl:template>

    <xsl:template match="KRAINA_GEOG">
        <xsl:variable name="bar-width" select="POWIERZCHNIA * $max-bar-length div $max-powierzchnia" />
        <g id="bar_{position()}" 
            transform="translate(0, {(position() - 1) * ($bar-height + $bar-spacing)})">
            <text x="0" y="{($bar-height + $bar-spacing) div 2}"><xsl:number format="1. " value="position()"/>
                <xsl:value-of select="NAZWA"/></text>
            <rect x="{$bar-start}" y="0" width="{$bar-width}" height="{$bar-height}" fill="lightgray"/>
            <text x="{$bar-width + $bar-start + 5}" y="{($bar-height + $bar-spacing) div 2}"><xsl:value-of select="POWIERZCHNIA"/></text>
        </g>
    </xsl:template>

</xsl:stylesheet>

And this is the resulting SVG you get when you run your source XML + this XSL stylesheet through a XSLT processor: http://codepen.io/helderdarocha/pen/iJrFb 这就是通过XSLT处理器运行源XML和此XSL样式表时得到的SVG: http : //codepen.io/helderdarocha/pen/iJrFb

You might also try generating it on the fly, saving the XSLT stylesheet above in a file ( svg-graph.xsl ), adding a <?xml-stylesheet processing instruction to your XML: 您也可以尝试动态生成它,将上面的XSLT样式表保存在文件( svg-graph.xsl )中,并在<?xml-stylesheet添加<?xml-stylesheet处理指令:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="svg-graph.xsl"?>
<SWIAT>
    <KRAINA_GEOG TYP="Pobrzeze">
        <NAZWA>Południowobałtyckie</NAZWA>
        <POWIERZCHNIA>19000</POWIERZCHNIA>
...

And loading it in a browser such as FireFox. 并将其加载到诸如FireFox的浏览器中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM