Черновик преобразования JSON в Protovis xlst - PullRequest
0 голосов
/ 03 февраля 2012

У меня очень простая таксономия, которую я редактирую в свободном уме, и я хочу визуализировать ее в протоисе как визуализацию солнечных лучей. Глубина таксономии неизвестна.

Я предпринял попытку создать преобразование XLST, которое можно использовать с экспортом Freemind с помощью функциональности сценария xsl - для вывода данных в точном формате JSON, необходимом Protovis для получения солнечных лучей - идея в том, что никаких дополнительных преобразований не требуется в JavaScript.

Пример выходного формата JSON, который я ищу, находится здесь: http://mbostock.github.com/protovis/ex/sunburst.html

Фактически формат файла freemind .mm является входным.

Выполнение моего альфа-кода (показанного ниже) в стилусе-студии создает формат json (плохо отформатированный, но кажется законным), который нормально передает протокол, когда я сохраняю вывод, сгенерированный из стилуса-студии, непосредственно в файл .js вручную. По какой-то причине Freemind, похоже, не экспортирует данные, используя этот код ...

Есть что-то, что я пропускаю? Любая помощь приветствуется.

Большое спасибо, Андрей

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

Я исправил код, проблема была в том, что некоторые из моих xsl не поддерживались движком xslt, используемым freemind. Я исправил код и переместил его на github под свободной лицензией и удалил его отсюда.

Адаптер доступен здесь: https://github.com/minkymorgan/Freemind2JSON#readme

  • Andrew

Ответы [ 2 ]

0 голосов
/ 01 декабря 2012

На случай, если это будет интересно ... Я только что добавил XSLT-скрипт для преобразования FreeMind в JSON. Мой сценарий немного проще и еще не поддерживает экранирование Javascript.

Он также не предназначен для использования в Protovis

0 голосов
/ 04 февраля 2012

Вот моя попытка.Я основал его на вашей версии и добавил еще несколько функций.

<?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
    }
};
...