2012-02-03 88 views
0

我有一個非常簡單的分類標準,我正在編輯freemind,並且想要在protovis中將它視覺化爲一個陽光可視化。分類的深度是未知的。Freemind到JSON到Protovis xlst轉換草稿

我已經嘗試構建一個可以通過xsl腳本功能與Freemind導出一起使用的XLST轉換 - 以Protovis生成sunburst所需的精確JSON格式輸出數據 - 沒有進一步轉換的想法是需要在JavaScript中。

輸出JSON格式我找的一個例子是在這裏: http://mbostock.github.com/protovis/ex/sunburst.html

有效的FreeMind的.mm文件格式輸入。

在手寫筆工作室中運行我的alpha代碼(如下所示)會建立一個json格式(格式嚴重但看起來合法),當我手動將手寫筆工作室生成的輸出直接保存到.js文件時,出於某種原因,Freemind似乎並未使用此代碼導出數據,但...

有什麼我失蹤了嗎? 任何幫助表示讚賞。

非常感謝,安德魯

=========== UPDATE =============

我已經糾正了碼,這個問題是我的一些xsl不受freemind使用的xslt引擎的支持。我更正了代碼,並將其移至github,並獲得自由許可,並將其從此處移除。

適配器可以在這裏找到: https://github.com/minkymorgan/Freemind2JSON#readme

  • 安德魯
+0

怎麼樣,如果你寫的轉換器,然後得到您的代碼在這裏幫助嗎?您將以這種方式獲得更多答案。 – 2012-02-03 14:30:57

+0

:-)我相信會這樣做,而且我正在開始。只是問在我重新發明車輪之前是否完成了。 A – Minkymorgan 2012-02-03 14:47:13

回答

0

這裏是我的嘗試。我基於你的版本,並增加了一些功能。

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

    <xsl:template match="/map"> 
     <xsl:text>var Map = { 
</xsl:text> 
     <xsl:apply-templates select="node"> 
      <xsl:with-param name="indent"> 
       <xsl:text> </xsl:text> 
      </xsl:with-param> 
     </xsl:apply-templates> 
     <xsl:text> 
}; 
</xsl:text> 
    </xsl:template> 

    <xsl:template match="node"> 
     <xsl:param name="indent"/> 
     <xsl:if test="position() != 1"> 
      <xsl:text>, 
</xsl:text> 
     </xsl:if> 
     <xsl:value-of select="$indent"/> 
     <xsl:text>"</xsl:text> 
     <xsl:call-template name="escape-javascript"> 
      <xsl:with-param name="string" 
       select="descendant-or-self::node/@TEXT"/> 
     </xsl:call-template> 
     <xsl:text>": </xsl:text> 
     <xsl:choose> 
      <xsl:when test="node"> 
       <xsl:text>{ 
</xsl:text> 
       <xsl:apply-templates select="node"> 
        <xsl:with-param name="indent"> 
         <xsl:value-of select="$indent"/> 
         <xsl:text> </xsl:text> 
        </xsl:with-param> 
       </xsl:apply-templates> 
       <xsl:text> 
</xsl:text> 
       <xsl:value-of select="$indent"/> 
       <xsl:text>}</xsl:text> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:text>10</xsl:text> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

    <!-- 
     Javascript string escape template by Jeni Tennison 
     Source: http://holytshirt.blogspot.com/2008/06/xslt-javascript-escaping.html 
     Author page: http://www.jenitennison.com/ 
    --> 
    <xsl:template name="escape-javascript"> 
     <xsl:param name="string" /> 
     <xsl:choose> 
      <xsl:when test='contains($string, "&apos;")'> 
       <xsl:call-template name="escape-javascript"> 
        <xsl:with-param name="string" 
         select='substring-before($string, "&apos;")' /> 
       </xsl:call-template> 
       <xsl:text>\'</xsl:text> 
       <xsl:call-template name="escape-javascript"> 
        <xsl:with-param name="string" 
         select='substring-after($string, "&apos;")' /> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:when test="contains($string, '&#xA;')"> 
       <xsl:call-template name="escape-javascript"> 
        <xsl:with-param name="string" 
         select="substring-before($string, '&#xA;')" /> 
       </xsl:call-template> 
       <xsl:text>\n</xsl:text> 
       <xsl:call-template name="escape-javascript"> 
        <xsl:with-param name="string" 
         select="substring-after($string, '&#xA;')" /> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:when test="contains($string, '\')"> 
       <xsl:value-of select="substring-before($string, '\')" /> 
       <xsl:text>\\</xsl:text> 
       <xsl:call-template name="escape-javascript"> 
        <xsl:with-param name="string" 
         select="substring-after($string, '\')" /> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise><xsl:value-of select="$string" /></xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

如果在Freemind test file運行時,它產生以下輸出:

var Map = { 
    "Notetest": { 
     "Notetest": 10, 
     "This is a node": { 
      "with a linbreak \n subnode": 10, 
      "and another subnode": 10, 
      "and some folded subnodes": { 
       "fold1": 10, 
       "fold2": 10, 
       "fold3": 10 
      } 
     }, 
     "Attributes": 10 
    } 
}; 
+0

嘿,那太好了,我會測試一下。謝謝。 – Minkymorgan 2012-02-04 19:56:38

+0

嗨MizardX,我做了一些測試。雖然你的代碼看起來比我的好得多,但我仍然沒有得到它來渲染Protvis圖形,我的基本努力正在渲染它。不知道爲什麼,但將進一步研究。記住我昨天學習了XLST,所以花一點時間讓我弄清楚你的代碼作品。 – Minkymorgan 2012-02-04 22:23:39

+0

這是怎麼回事?你有沒有發現問題? – 2012-02-12 11:43:17

0

在情況下,它的利益......我只是把一個XSLT腳本的FreeMind轉換成JSON。 我的腳本稍微簡單一些,但還不支持Javascript轉義。

它也沒有設計用於Protovis