GML文档向SVG文档转换,是通过将编写好的样式表(XSL)和GML源文件,传递给XSLT处理器进行执行实现的。用户查询是变化的,相应的GML文档也是变化的,则GML文档向SVG文档转化时所用的样式表也是变化的,所以样式表应该动态生成。因此,在中介器上有一个元数据数据库,每一个元数据对应一个样式表,如元数据LineString对应一个名为LineString.xsl的样式表。当GML文档向SVG转化时,先对GML文档进行遍历,将出现的元数据所对应的样式表集成,生成一个新的样式表,根据这个样式表将GML文档转化为SVG图像,再将SVG图像返回给用户。
创建样式表,最主要的问题就是如何定义模板。根据源文档的结构,在样式表中寻找匹配的模板片断,进行相应的转换。
下面是XSL样式表文件中如何将点元素进行转换的代码片断。
<xsl:param name="pointWidth" select="5" />
<xsl:template match="gml:pointMember/gml:Point | gml:pointProperty/ gml:Point">
<xsl:variable name="x0" select="gml:coord/gml:X" />
<xsl:variable name="y0" select="gml:coord/gml:Y" />
<xsl:element name="circle">
<xsl:attribute name="cx">
<xsl:value-of select="$x0" />
</xsl:attribute>
<xsl:attribute name="cy">
<xsl:value-of select="$y0" />
</xsl:attribute>
<xsl:attribute name="r">
<xsl:value-of select="$pointWidth" />
</xsl:attribute>
</xsl:element>
</xsl:template>
这里首先定义了pointWidth,将其定义为5。GML中有point元素,而在SVG中没有point元素,所以在这里我们用5个象素的circle来代替point。可以看到,程序首先找到Point节点,将其坐标X和Y值读入变量x0和y0中;然后输出一个上下文节点元素circle,并设置其属性cx的值为变量x0的值,设置其属性cy的值为变量y0的值,设置其属性r的值为pointWidth的值。通过此段XSL片断,就可以将GML规范中的point转换为SVG规范文档中的circle。其它的类似。GML元素到SVG元素的对应关系如下表所示:
GML元素 | SVG元素 |
Point | circle |
MultiPoint | grouped circles |
LineString | polyline |
MultiLineString | grouped polylines |
Polygon | path |
MultiPolygon | grouped paths |
表 GML元素转换到SVG元素的对应关系
这里只是一个最简单的说明转换过程的例子,如何将GML文档完善的转换为SVG文档,需要考虑的问题还非常的多。