修改专有Blumind XML文档的XSL

修改专有Blumind XML文档的XSL,xml,xslt,Xml,Xslt,我正在尝试使用XSL和MSXSL修改一个所有者XML文件。所讨论的软件是Blumind(Blumind.org),一个非常漂亮且完全可移植的思维导图应用程序(我与作者没有联系)。它提供了“进度条”,我希望每个节点的进度都能反映下面的进度总和。我打算将其用作一个组合项目建模和管理工具 我计划在每次加载其中一个文件时运行一个名为MSXML.EXE的批处理文件,以更新进度。重要的是,文件的结构保持不变,只改变各个/map/nodes/node/widgets/widget/@value点的值,然后改变

我正在尝试使用XSL和MSXSL修改一个所有者XML文件。所讨论的软件是Blumind(Blumind.org),一个非常漂亮且完全可移植的思维导图应用程序(我与作者没有联系)。它提供了“进度条”,我希望每个节点的进度都能反映下面的进度总和。我打算将其用作一个组合项目建模和管理工具

我计划在每次加载其中一个文件时运行一个名为MSXML.EXE的批处理文件,以更新进度。重要的是,文件的结构保持不变,只改变各个/map/nodes/node/widgets/widget/@value点的值,然后改变相应的/map/nodes/node/widgets/widget/@max点

并非所有节点都有进度条,并非所有具有进度条的节点都有具有进度条的子节点。因此,逻辑只需要将进度条更改为子进程中的进度总和-如果子进程有进度条!如果更改了“进度”的@value,我们需要对@max value进行类似的更改,以使分母与“进度”保持同步(小部件将显示正确的比例,但不会计算百分比-它只是将“%”添加到值中!)

抱歉,如果这很难可视化,我建议从下载1.3版便携式zip文件并加载此文件(重命名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>

1
对
真的
白色
黑色
浅灰色
石板灰
浅灰色
黑色
皇家蓝
中板岩蓝
绿色
银币
黑色
黑色
12
我对XSL非常陌生,正在努力,我会在AWK中做得更好吗?标识脚本对于保留文件结构似乎很有用。然而,我在尝试编写逻辑以更改进度值时不知所措。本能告诉我,如果文件是反向解析的,那就容易多了

向后: 1.对于每个新分支终端-如果检测到进度条,则保留@value和@max的运行总计。 2.将此运行总数分配给任何其他进度条,直到两个分支会聚。 3.在收敛点处,将两组总数相加,然后继续

由于每个节点可以有多个进度条,因此最好分别为找到的每种不同颜色的进度条重复计算-这对XSL向导来说是一个挑战


我将非常感谢您的帮助。

这应该符合我在对您的问题的评论中所描述的:

<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
元素没有子元素,它们只能具有示例中列出的属性。

因此,您希望生成一个新的XML文件,其结构和内容与您发布的示例完全相同,但,对于进度条小部件,使用
@max
@value
等于具有相同颜色的子进度条小部件的总和-正确吗?非常感谢,这非常有效。我将在Blumind网站上添加指向此主题的链接。我开始看到XSL的威力。亲切的问候。完成。