2016-11-02 6 views
-1

У меня есть пользовательский графический формат в формате xml-like. Я хочу упорядочить узлы, textview и edge s как есть, определенно. Мой подход заключается в использовании XSL трансформаций от xml до svg. Я новичок в формате svg, но немного поработал с xsl previosuly. Интересно, не решена ли такая задача, как graphml to svg, в yEd. Есть ли какой-нибудь удобный способ сделать такое преобразование?Как преобразовать пользовательский графический формат в графический вид SVG через XSLT?

<?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 к прямоугольникам, но не оказал SVG как-то при открытии в Inkscape.

<?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> 

ответ

3

Основная проблема с вашей таблицей стилей заключается в том, что элементы, которые вы создаете, не находятся в пространстве имен SVG. Вы можете исправить это легко сделать пространство имен SVG пространства имен по умолчанию таблицы стилей - IOW, изменить:

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

к:

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

Другое дело в том, что ваш расчет возвращает отрицательный рост, который не разрешен в SVG.

+0

Я изменил его, теперь элементы должны быть в svg ns, но графика уже скрыта. Но я могу просмотреть его через редактор xml в inkscape. – Juriy

+0

@Juriy Я не уверен, что вы пытаетесь сказать. –

+1

@Juriy: Этот ответ охватывает ваши две основные проблемы. Рассмотрим [** принятие этого **] (http://meta.stackoverflow.com/q/5234/234215), а затем для остальной части ваших проблем сначала создайте SVG вручную, чтобы достичь желаемых результатов. Тогда будет легче настроить таргетинг на SVG через XSLT. – kjhughes