2012-03-14 19 views
0

XSLとMSXSLを使用して独自のXMLファイルを変更しようとしています。問題のソフトウェアはBlumind(blumind.org)です。非常にきれいで完全に移植可能なマインドマッピングアプリケーションです(私は著者とは関係ありません)。それは "進捗バー"を提供し、私は各ノードの進捗状況を以下の進捗の合計を反映させたいと思います。これをプロジェクトのモデリングと管理の統合ツールとして使用することが私の意図です。XSLで独自のBlumind XMLドキュメントを変更する

MSXML.EXEを呼び出すバッチファイルを実行するときに、これらのファイルのいずれかを読み込んで進捗状況を更新する予定です。ファイルの構造は変わらず、さまざまな/ map/nodes/node/widgets/widget/@ valueポイントとそれに対応する/ map/nodes/node/widgets/widget/@ maxポイントの値を変更するだけです。

すべてのノードにプログレスバーがあるわけではありません。プログレスバーを持つすべてのノードにプログレスバー付きの子があるわけではありません。したがって、ロジックではプログレスバーを子供の進歩の合計に変更するだけで済みます - 子供にプログレスバーがある場合"進捗状況"の値が変更された場合、分母を "進捗状況"と同期させるために@max値を同様に変更する必要があります(ウィジェットは正しい比率を表示しますが、 justsは値に "%"を追加します)。

申し訳ありませんが、これは視覚化することは困難であるならば、私は(test.bmdの名前を変更)http://blumind.org/downloadからバージョン1.3ポータブルzipファイルをダウンロードし、このファイルをロードする推薦は: -

私はこのコードをidentをするのでamanyの方法を試してみました申し訳ありません - どうすればいいですか?

<?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> 

私はAWKで良いだろう、XSLに非常に新しいですし、苦労していますか?アイデンティティスクリプトは、ファイル構造を保持するのに便利です。しかし、私は進歩のための値を変更するロジックを書こうとして迷っています。本能は、もしファイルが後方に解析されていればもっと簡単になるだろうと私に伝えます。

戻る: 1.新しいブランチ端末ごとに、進行状況バーが検出された場合は、@valueと@maxの合計を維持します。 2. 2つの分岐が収束するまで、この進行中の合計を他の進行状況バーに割り当てます。 3.コンバージェンス時に、2つの合計セットを追加して続行します。

各ノードは複数のプログレスバーを持つことができるため、見つかったプログレスバーのそれぞれの色ごとに別々に計算を繰り返すといいでしょう。そこにあるXSLウィザードへの挑戦です!

私は非常に助けに感謝します。

+0

投稿したサンプルの構造と内容と全く同じ新しいXMLファイルを生成したいが、進行状況バーウィジェットの '@ max'と' @ value'を子進行状況バーウィジェットの合計同じ色で - 正しい? – MiMo

+0

多くのおかげでこれは完全に動作します。 Blumindサイトでこのトピックへのリンクを追加します。私はXSLの力を見始める。敬具。 – Gavin

+0

[link](http://blumind.org/feedback#comment-1697)完了。 – Gavin

答えて

0

これは私があなたの質問に私のコメントに記述するものを行う必要があります。

<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要素が子を持っているし、彼らはあなたの例にリストされている属性のみを持つことができることはありませんと仮定しています。

関連する問題