0

我在 freemind 中编辑了一个非常简单的分类法,并希望在 protovis 中将其可视化为旭日形可视化。分类的深度未知。

我已经尝试构建一个 XLST 转换,该转换可以通过 xsl 脚本功能与 Freemind 的导出一起使用 - 以 Protovis 生成旭日形所需的确切 JSON 格式输出数据 - 这个想法是在 javascript 中不需要进一步的转换。

我正在寻找的输出 JSON 格式的示例在这里: http: //mbostock.github.com/protovis/ex/sunburst.html

实际上,freemind .mm 文件格式是输入。

在 stylus studio 中运行我的 alpha 代码(如下所示)会构建一个 json 格式(格式错误但似乎合法),当我将 stylus studio 生成的输出直接手动保存到 .js 文件时,它会提供 protovis ok。出于某种原因,Freemind 似乎没有使用此代码导出数据......

有什么我想念的吗?任何帮助表示赞赏。

非常感谢,安德鲁

===========更新==============

我已经更正了代码,问题是freemind使用的xslt引擎不支持我的一些xsl。我更正了代码并在自由许可下将其移至 github 并从此处将其删除。

该适配器可在此处获得: https ://github.com/minkymorgan/Freemind2JSON#readme

  • 安德鲁
4

2 回答 2

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 测试文件上运行,它会产生以下输出:

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
    }
};
于 2012-02-04T18:50:03.043 回答
0

以防万一……我刚刚推送了一个用于将 FreeMind 转换为 JSON 的 XSLT 脚本。我的脚本稍微简单一些,还不支持 Javascript 转义。

它也不是为在 Protovis 中使用而设计的

于 2012-12-01T16:36:51.603 回答