如何通过 XSLT 将自定义图形格式转换为 SVG 图形视图?
How to transform custom graphic format to SVG graphics view via XSLT?
我有 xml
格式的自定义图形格式。我想按原样安排节点 textview
和 edge
s,当然。我的方法是使用 XSL
从 xml
到 svg
的转换。我是 svg 格式的新手,但以前使用过 xsl
。我想知道这样的任务是否已经像 yEd
中的 graphml to svg
功能一样解决了。有什么方便的方法可以进行这样的转换吗?
<?xml version="1.0" encoding="windows-1251"?>
<project version="1.2">
<calc allowworktime="false" cutoff="0"/>
<sfc>
<graphview>
<nodeview idref="1">
<properties>
<color value="#FF000000" name="outline.color"/>
<rectangle left="165" top="85" right="195" bottom="115" name="bounds"/>
<color value="#FFFFFFFF" name="fill.color"/>
</properties>
</nodeview>
<edgeview idref="1">
<properties>
<color value="#FF000000" name="outline.color"/>
</properties>
</edgeview>
<textview>
<properties>
<color value="#00000000" name="outline.color"/>
<color value="#FF000000" name="label.font.color"/>
<integer value="8" name="label.font.size"/>
<rectangle left="176" top="63" right="194" bottom="78" name="bounds"/>
<string value="Tahoma" name="label.font.family"/>
<color value="#00000000" name="fill.color"/>
<integer value="0" name="label.font.style"/>
<string value="Ë1" name="label.text"/>
</properties>
</textview>
</graphview>
</sfc>
</project>
我刚刚创建了示例 xslt
,它可以将节点视图转换为矩形,但在 inkscape 中打开时 svg 无法以某种方式呈现。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:local="local"
exclude-result-prefixes="xs"
version="2.0"
xmlns:svg="http://www.w3.org/2000/svg">
<xsl:output indent="yes"/>
<xsl:template match="/">
<svg>
<xsl:apply-templates select="@* | node()"/>
</svg>
</xsl:template>
<xsl:template match="//graphview/nodeview">
<xsl:variable name="nodeleft" select="properties/rectangle/@left"/>
<xsl:variable name="noderight" select="properties/rectangle/@right"/>
<xsl:variable name="nodetop" select="properties/rectangle/@top"/>
<xsl:variable name="nodebottom" select="properties/rectangle/@bottom"/>
<!-- adding svg group item -->
<g>
<xsl:element name="rect">
<xsl:attribute name="x"><xsl:value-of select="$nodeleft"/></xsl:attribute>
<xsl:attribute name="width"><xsl:value-of select="($noderight - $nodeleft)"/></xsl:attribute>
<xsl:attribute name="height"><xsl:value-of select="($nodetop - $nodebottom)"/></xsl:attribute>
<xsl:attribute name="y"><xsl:value-of select="($nodetop)"/></xsl:attribute>
</xsl:element>
</g>
</xsl:template>
</xsl:stylesheet>
样式表的主要问题是您创建的元素不在 SVG 命名空间中。您可以通过将 SVG 命名空间设为样式表的默认命名空间来轻松解决此问题 - IOW,更改此设置:
xmlns:svg="http://www.w3.org/2000/svg"
至:
xmlns="http://www.w3.org/2000/svg"
另一件事是您的计算 returns 负高度,这在 SVG 中是不允许的。
我有 xml
格式的自定义图形格式。我想按原样安排节点 textview
和 edge
s,当然。我的方法是使用 XSL
从 xml
到 svg
的转换。我是 svg 格式的新手,但以前使用过 xsl
。我想知道这样的任务是否已经像 yEd
中的 graphml to svg
功能一样解决了。有什么方便的方法可以进行这样的转换吗?
<?xml version="1.0" encoding="windows-1251"?>
<project version="1.2">
<calc allowworktime="false" cutoff="0"/>
<sfc>
<graphview>
<nodeview idref="1">
<properties>
<color value="#FF000000" name="outline.color"/>
<rectangle left="165" top="85" right="195" bottom="115" name="bounds"/>
<color value="#FFFFFFFF" name="fill.color"/>
</properties>
</nodeview>
<edgeview idref="1">
<properties>
<color value="#FF000000" name="outline.color"/>
</properties>
</edgeview>
<textview>
<properties>
<color value="#00000000" name="outline.color"/>
<color value="#FF000000" name="label.font.color"/>
<integer value="8" name="label.font.size"/>
<rectangle left="176" top="63" right="194" bottom="78" name="bounds"/>
<string value="Tahoma" name="label.font.family"/>
<color value="#00000000" name="fill.color"/>
<integer value="0" name="label.font.style"/>
<string value="Ë1" name="label.text"/>
</properties>
</textview>
</graphview>
</sfc>
</project>
我刚刚创建了示例 xslt
,它可以将节点视图转换为矩形,但在 inkscape 中打开时 svg 无法以某种方式呈现。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:local="local"
exclude-result-prefixes="xs"
version="2.0"
xmlns:svg="http://www.w3.org/2000/svg">
<xsl:output indent="yes"/>
<xsl:template match="/">
<svg>
<xsl:apply-templates select="@* | node()"/>
</svg>
</xsl:template>
<xsl:template match="//graphview/nodeview">
<xsl:variable name="nodeleft" select="properties/rectangle/@left"/>
<xsl:variable name="noderight" select="properties/rectangle/@right"/>
<xsl:variable name="nodetop" select="properties/rectangle/@top"/>
<xsl:variable name="nodebottom" select="properties/rectangle/@bottom"/>
<!-- adding svg group item -->
<g>
<xsl:element name="rect">
<xsl:attribute name="x"><xsl:value-of select="$nodeleft"/></xsl:attribute>
<xsl:attribute name="width"><xsl:value-of select="($noderight - $nodeleft)"/></xsl:attribute>
<xsl:attribute name="height"><xsl:value-of select="($nodetop - $nodebottom)"/></xsl:attribute>
<xsl:attribute name="y"><xsl:value-of select="($nodetop)"/></xsl:attribute>
</xsl:element>
</g>
</xsl:template>
</xsl:stylesheet>
样式表的主要问题是您创建的元素不在 SVG 命名空间中。您可以通过将 SVG 命名空间设为样式表的默认命名空间来轻松解决此问题 - IOW,更改此设置:
xmlns:svg="http://www.w3.org/2000/svg"
至:
xmlns="http://www.w3.org/2000/svg"
另一件事是您的计算 returns 负高度,这在 SVG 中是不允许的。