- Timestamp:
- 08/20/13 11:28:24 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
SMC/trunk/SMC/src/xsl/graph2json-d3.xsl
r2451 r3435 1 <?xml version="1.0" ?>1 <?xml version="1.0" encoding="UTF-8"?> 2 2 <!-- Generic stylesheet for viewing XML --> 3 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 4 xmlns:my="myFunctions" 5 xmlns:svg="http://www.w3.org/2000/svg" > 6 7 <xsl:output method="text" encoding="utf-8" 8 indent="yes" 9 /> 3 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:svg="http://www.w3.org/2000/svg" xmlns:my="myFunctions" version="2.0"> 4 <xsl:output method="text" encoding="utf-8" indent="yes"/> 10 5 <!-- 11 6 <purpose>transform a graph-xml (internal, TODO: align with some standard) … … 18 13 <sample> 19 14 --> 20 21 <xsl:param name="rank-distance" select="100" /> 22 23 <xsl:param name="svg-file" select="'cmd-dep-graph.svg'" /> 15 <xsl:param name="max-level" select="10"/> 16 <xsl:param name="rank-distance" select="100"/> 17 <xsl:param name="svg-file" select="'cmd-dep-graph.svg'"/> 24 18 <!-- <xsl:param name="svg-file" select="'cmd-dep-graph.svg'" />--> 25 26 <xsl:variable name="svg" select="if(doc-available(resolve-uri($svg-file,base-uri(/)))) then doc(resolve-uri($svg-file,base-uri(/))) else () " /> 19 <xsl:variable name="svg" select="if(doc-available(resolve-uri($svg-file,base-uri(/)))) then doc(resolve-uri($svg-file,base-uri(/))) else () "/> 27 20 <!-- <xsl:variable name="svg" select="if(doc-available($svg-file)) then doc($svg-file) else () " />--> 28 <xsl:variable name="svg-elements" select="$svg//svg:g[@class='node']" 21 <xsl:variable name="svg-elements" select="$svg//svg:g[@class='node']"/> 29 22 30 23 <!-- average rank-distance 31 24 trying to determine based on the x-values of the text-nodes--> 32 <xsl:variable name="svg-rank-distance" > 33 25 <xsl:variable name="svg-rank-distance"> 34 26 <xsl:variable name="xs"> 35 27 <xsl:for-each-group select="$svg-elements/svg:text/@x" group-by="."> 36 37 <xsl:sort select="." data-type="number"></xsl:sort> 38 <xsl:sequence select="number(.)"></xsl:sequence> 28 <xsl:sort select="." data-type="number"/> 29 <xsl:sequence select="number(.)"/> 39 30 </xsl:for-each-group> 40 </xsl:variable> 41 42 <xsl:variable name="xs-seq" select="tokenize($xs, ' ')" /> 31 </xsl:variable> 32 <xsl:variable name="xs-seq" select="tokenize($xs, ' ')"/> 43 33 <xsl:variable name="diffs"> 44 <xsl:for-each select="$xs-seq[position() !=last()]" 45 <xsl:variable name="pos" select="position()" ></xsl:variable>46 <xsl:sequence select="number($xs-seq[$pos + 1]) - number(current())" ></xsl:sequence>34 <xsl:for-each select="$xs-seq[position() !=last()]"> 35 <xsl:variable name="pos" select="position()"/> 36 <xsl:sequence select="number($xs-seq[$pos + 1]) - number(current())"/> 47 37 </xsl:for-each> 48 38 </xsl:variable> 49 39 <!--<xsl:copy-of select="avg(number(tokenize($diffs,';')))" />--> 50 <xsl:value-of select="floor(avg(for $i in tokenize($diffs,' ') return number($i)))" 40 <xsl:value-of select="floor(avg(for $i in tokenize($diffs,' ') return number($i)))"/> 51 41 </xsl:variable> 52 53 <xsl:template match="/" > 54 <xsl:apply-templates select="graph" mode="json-d3" ></xsl:apply-templates> 42 <xsl:template match="/"> 43 <xsl:apply-templates select="graph" mode="json-d3"/> 55 44 </xsl:template> 56 57 <xsl:template match="graph" mode="json-d3"> 45 <xsl:template match="graph" mode="json-d3"> 58 46 <!-- <xsl:value-of select="doc-available($svg-file)" /> 59 47 svg-file:<xsl:value-of select="$svg-file" /> 60 48 svg-rank-distance: <xsl:value-of select="$svg-rank-distance"></xsl:value-of> 61 --> 62 63 <xsl:text>{</xsl:text> 64 <xsl:apply-templates select="nodes" /> 65 <xsl:text>, 49 --> 50 <xsl:text>{</xsl:text> 51 <xsl:apply-templates select="nodes"/> 52 <xsl:text>, 66 53 </xsl:text> 67 <xsl:apply-templates select="edges" /> 68 <xsl:text>}</xsl:text> 69 </xsl:template> 70 71 <xsl:template match="nodes" > 72 <xsl:text> "nodes": [</xsl:text> 73 <xsl:apply-templates select="*"></xsl:apply-templates> 74 <xsl:text>]</xsl:text> 75 </xsl:template> 76 77 <xsl:template match="nodes/*"> 78 <xsl:text>{</xsl:text> 79 <xsl:for-each select="@*" > 80 <xsl:text>"</xsl:text><xsl:value-of select="name()" /><xsl:text>":"</xsl:text> 81 <xsl:value-of select="." /><xsl:text>",</xsl:text> 54 <xsl:apply-templates select="edges"/> 55 <xsl:text>}</xsl:text> 56 </xsl:template> 57 <xsl:template match="nodes"> 58 <xsl:text> "nodes": [</xsl:text> 59 <xsl:apply-templates select="*"/> 60 <xsl:text>]</xsl:text> 61 </xsl:template> 62 <xsl:template match="nodes/*"> 63 <xsl:text>{</xsl:text> 64 <xsl:for-each select="@*"> 65 <xsl:text>"</xsl:text> 66 <xsl:value-of select="name()"/> 67 <xsl:text>":"</xsl:text> 68 <xsl:value-of select="."/> 69 <xsl:text>",</xsl:text> 82 70 <!-- <xsl:if test="not(position()=last())"><xsl:text>, </xsl:text></xsl:if> --> 83 71 </xsl:for-each> 84 72 <!-- adding initial x based on level --> 85 <xsl:variable name="svg-element" select="$svg-elements[starts-with(svg:title,current()/@key)][1]" /> 86 <xsl:text>"init_x":</xsl:text><xsl:value-of select="if ($svg-element) then floor($svg-element/svg:text/@x div $svg-rank-distance * $rank-distance) else @level * $rank-distance" /> 73 <xsl:variable name="svg-element" select="$svg-elements[starts-with(svg:title,current()/@key)][1]"/> 74 <xsl:text>"init_x":</xsl:text> 75 <xsl:value-of select="if ($svg-element/svg:text/@x) then floor($svg-element/svg:text/@x div $svg-rank-distance * $rank-distance) else if (number(@level)=number(@level)) then @level * $rank-distance else $max-level * $rank-distance"/> 87 76 <!-- <xsl:text>, "px":</xsl:text><xsl:value-of select="@level * $rank-distance" />--> 88 <xsl:text>, "init_y":</xsl:text><xsl:value-of select="if ($svg-element) then round($svg-element/svg:text/@y div -50) else @level * $rank-distance" /> 77 <xsl:text>, "init_y":</xsl:text> 78 <xsl:value-of select="if ($svg-element/svg:text/@y) then round($svg-element/svg:text/@y div -50) else if (number(@level)=number(@level)) then @level * $rank-distance else $max-level * $rank-distance"/> 89 79 <!-- <xsl:text>, "py":</xsl:text><xsl:value-of select="@level * $rank-distance" />--> 90 80 <!--"name":"</xsl:text><xsl:value-of select="@label" /><xsl:text>", "weight":</xsl:text> 91 81 <xsl:value-of select="@count" /><xsl:text>, "group": </xsl:text><xsl:value-of select="@group" />--> 92 <xsl:text>}</xsl:text>93 <xsl:if test="not(position()=last())"><xsl:text>,94 </xsl:text></xsl:if>95 </xsl:template>96 97 98 <xsl:template match="edges" 82 <xsl:text>}</xsl:text> 83 <xsl:if test="not(position()=last())"> 84 <xsl:text>, 85 </xsl:text> 86 </xsl:if> 87 </xsl:template> 88 <xsl:template match="edges"> 99 89 <xsl:text> "links": [</xsl:text> 100 <xsl:apply-templates select="*" ></xsl:apply-templates>90 <xsl:apply-templates select="*"/> 101 91 <xsl:text>]</xsl:text> 102 92 </xsl:template> 103 104 <xsl:template match="edges/*"> 105 <xsl:text>{"source":</xsl:text><xsl:value-of select="@ix_from" /><xsl:text>, "target":</xsl:text><xsl:value-of 106 select="@ix_to" /><xsl:text>, "value":</xsl:text><xsl:value-of select="@value" /> 93 <xsl:template match="edges/*"> 94 <xsl:text>{"source":</xsl:text> 95 <xsl:value-of select="@ix_from"/> 96 <xsl:text>, "target":</xsl:text> 97 <xsl:value-of select="@ix_to"/> 98 <xsl:text>, "value":</xsl:text> 99 <xsl:value-of select="@value"/> 107 100 <!-- <xsl:text>{"source":"</xsl:text><xsl:value-of select="@from" /><xsl:text>", "target":"</xsl:text><xsl:value-of select="@to" /><xsl:text>", "value":</xsl:text><xsl:value-of select="$count" />--> 108 <xsl:text>}</xsl:text> 109 <xsl:if test="not(position()=last())"><xsl:text>, 110 </xsl:text></xsl:if> 111 112 </xsl:template> 113 114 <xsl:template match="text()"/> 115 101 <xsl:text>}</xsl:text> 102 <xsl:if test="not(position()=last())"> 103 <xsl:text>, 104 </xsl:text> 105 </xsl:if> 106 </xsl:template> 107 <xsl:template match="text()"/> 116 108 </xsl:stylesheet>
Note: See TracChangeset
for help on using the changeset viewer.