Я пытаюсь изменить собственный 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!
Буду очень признателен за любую помощь.