XSL для изменения проприетарного документа Blumind XML - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь изменить собственный XML-файл, используя XSL и MSXSL. Программное обеспечение, о котором идет речь, - Blumind (blumind.org), очень красивое и полностью переносимое приложение для составления карт разума (у меня нет связи с автором). Он предлагает «индикаторы выполнения», и я хотел бы, чтобы прогресс на каждом узле отражал сумму прогресса ниже. Я намерен использовать это в качестве комбинированного инструмента моделирования и управления проектами.

Я планирую запускать пакетный файл с именем MSXML.EXE каждый раз, когда загружаю один из этих файлов, чтобы обновить ход выполнения. Важно, чтобы структура файла оставалась неизменной, изменяя значение только в различных точках / map / node / node / widgets / widget / @ value, а затем в соответствующих / map / node / node / widgets / widget / @ max точках.

Не у всех узлов будет индикатор выполнения, не у всех узлов с индикаторами выполнения будут дочерние элементы с индикаторами выполнения. Таким образом, логика должна только изменить индикатор выполнения на сумму прогресса у детей - если у детей есть индикаторы выполнения! Там, где @value для «progress» изменяется, нам нужно сделать аналогичное изменение значения @max, чтобы знаменатель был синхронизирован с «progress» (виджет будет отображать правильные пропорции, но не будет вычислять процент - он justs добавляет «%» к значению!).

Извините, если это трудно визуализировать, я бы порекомендовал загрузить переносной zip-файл версии 1.3 из http://blumind.org/download и загрузить этот файл (переименовать test.bmd): -

Извините, я попробовал так много способов идентифицировать этот код - как мне это сделать?

<?xml version="1.0" encoding="utf-8"?>
<map name="test" document_type="Blumind" editor_version="1.3.21.1">
<!--Create by Blumind, you can download it free from http://www.blumind.org/download-->
    <info>
        <author>
        </author>
        <company>
        </company>
        <version>1.0</version>
    </info>
    <layout>TREE_RIGHT</layout>
    <attributes>
        <item name="editor_show_sidebar">True</item>
    </attributes>
    <style>
        <back_color>White</back_color>
        <fore_color>Black</fore_color>
        <line_color>LightSlateGray</line_color>
        <border_color>SlateGray</border_color>
        <node_back_color>LightGray</node_back_color>
        <node_fore_color>Black</node_fore_color>
        <select_color>RoyalBlue</select_color>
        <hover_color>MediumSlateBlue</hover_color>
        <link_line_color>Green</link_line_color>
    </style>
    <nodes>
        <node text="Overall Progress">
            <style>
                <back_color>Silver</back_color>
                <fore_color>Black</fore_color>
                <border_color>Black</border_color>
                <padding>12</padding>
            </style>
            <widgets>
                <widget type="PROGRESSBAR" max="1000" min="0" value="500" show_text="False" 
                color="Green" back_color="White" fore_color="Black" height="39" align="Bottom" hyperlink="" />
            </widgets>
            <nodes>
                <node text="Source Code " width="200">
                    <widgets>
                        <widget type="PROGRESSBAR" max="10" min="0" value="20" show_text="False" 
                        color="Green" back_color="White" fore_color="Black" align="Bottom" hyperlink="" />
                    </widgets>
                    <nodes>
                        <node text="Primary Module" width="100">
                            <widgets>
                                <widget type="PROGRESSBAR" max="100" min="0" value="50" show_text="False" 
                                color="Green" back_color="White" fore_color="Black" align="Bottom" hyperlink="" />
                            </widgets>
                        </node>
                        <node text="Legacy Import" width="100">
                            <widgets>
                                <widget type="PROGRESSBAR" max="100" min="0" value="50" show_text="False" 
                                color="Green" back_color="White" fore_color="Black" align="Bottom" hyperlink="" />
                            </widgets>
                        </node>
                    </nodes>
                </node>
                <node text="Unit Testing" width="200">
                    <widgets>
                        <widget type="PROGRESSBAR" max="100" min="0" value="50" show_text="False" 
                        color="Green" back_color="White" fore_color="Black" align="Bottom" hyperlink="" />
                    </widgets>
                </node>
                <node text="Acceptance Testing" width="200">
                    <widgets>
                        <widget type="PROGRESSBAR" max="100" min="0" value="20" show_text="False" 
                        color="Green" back_color="White" fore_color="Black" align="Bottom" hyperlink="" />
                    </widgets>
                </node>
                <node text="Usability Testing" width="200">
                    <widgets>
                        <widget type="PROGRESSBAR" max="100" min="0" value="5" show_text="False" 
                        color="Green" back_color="White" fore_color="Black" align="Bottom" hyperlink="" />
                    </widgets>
                </node>
            </nodes>
        </node>
    </nodes>
</map>

Я очень новичок в XSL и изо всех сил, буду ли я лучше в AWK? Скрипт идентификации выглядит полезным для сохранения структуры файла. Однако я растерялся, пытаясь написать логику, чтобы изменить значения для прогресса. Инстинкт говорит мне, что если файл будет проанализирован в обратном направлении, это будет намного проще!

Backwards: 1. Для каждого нового терминала филиала - если обнаружен индикатор выполнения, сохраняйте промежуточные суммы для @value и @max. 2. Назначьте эту промежуточную сумму для любых дальнейших индикаторов выполнения, пока две ветви не сойдутся. 3. При сближении сложите два набора итогов и продолжите.

Поскольку каждый узел может иметь более одного индикатора выполнения, было бы неплохо повторить вычисления отдельно для каждого найденного отдельного цвета индикатора выполнения - вызов для волшебников XSL!

Буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 14 марта 2012

Это должно сделать то, что я описываю в своем комментарии к вашему вопросу:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="widget[@type='PROGRESSBAR']">
    <xsl:variable name="color" select="@color"/>
    <xsl:variable name="childProgressBars" select="../../nodes//widget[@type='PROGRESSBAR' and @color=$color and not(../../nodes//widget)]"/>
    <xsl:variable name="value">
      <xsl:choose>
        <xsl:when test="$childProgressBars">
          <xsl:value-of select="sum($childProgressBars/@value)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="@value"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name="max">
      <xsl:choose>
        <xsl:when test="$childProgressBars">
          <xsl:value-of select="sum($childProgressBars/@max)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="@max"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <widget type="PROGRESSBAR" max="{$max}" min="{@min}" value="{$value}" show_text="{@showText}"
    color="{@color}" back_color="{@back_color}" fore_color="{@fore_color}" align="{@align}" hyperlink="{@hyperLink}" />
  </xsl:template>

</xsl:stylesheet>

Я предполагаю, что элемент widget не имеет дочерних элементов и что они могут иметь только те атрибуты, которые перечислены в вашемпример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...