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