【问题标题】:How to transform custom graphic format to SVG graphics view via XSLT?如何通过 XSLT 将自定义图形格式转换为 SVG 图形视图?
【发布时间】:2017-03-16 05:54:12
【问题描述】:

我有xml-like 格式的自定义图形格式。我想按原样安排节点textviewedges,当然。我的方法是使用从xmlsvgXSL 转换。我是 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,它可以将nodeviews 转换为rects,但是在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>

【问题讨论】:

    标签: xml xslt svg converter graph-visualization


    【解决方案1】:

    样式表的主要问题是您创建的元素不在 SVG 命名空间中。您可以通过将 SVG 命名空间设置为样式表的默认命名空间来轻松解决此问题 - IOW,更改此:

    xmlns:svg="http://www.w3.org/2000/svg"
    

    到:

    xmlns="http://www.w3.org/2000/svg"
    

    另一件事是您的计算返回负高度,这在 SVG 中是不允许的。

    【讨论】:

    • 我已经改变了,元素现在是 svg ns,但是图形已经隐藏了。但我可以通过inkscape中的xml编辑器查看它。
    • @Juriy 我不确定你想说什么。
    • @Juriy:这个答案涵盖了你的两个主要问题。考虑accepting it,然后对于您的其余问题,首先尝试手动创建 SVG 以达到您想要的结果。然后通过 XSLT 定位该 SVG 会更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2014-10-16
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多