2011-12-16 8 views
2

はじめに:XSLTで作成しているテーブルがあります(テーブル形式のツリービューです)。私はでした。子ノードを手動で非表示/表示しているJSを処理していましたが、すぐに混乱してしまい、保守が難しくなりました。私はJQTreeTableと遊び始めました。 http://pastebin.com/NQVHsy69XSLT処理後の位置の配列の生成

問題:JQTreeTableはアレイを介して、ノードが関連している方法を知っている必要がある。ここで

は、例えば、入力(これはJSFiddleリンクに一致する)です。あなたはJavaScriptを見ればhttp://jsfiddle.net/vt7Xd/30/

:これは、見えるようになっているものである

var map1 = [0,  1,  1,  1,  1,  1,  6,  1  ]; 
      ^5600^5601^5602^5603^5604^5605^5606^5607 

これらは、位置/関係識別子です。最初の要素はルート(0)で、次の数は最初の行の子です。それから、7行目は6番目の子です。

この配列をXSLTで生成する必要があります。適切なレベルを得るためにposition()を使用すると問題はありませんが、この配列が処理の最後に生成されることを保証するにはどうしたらいいですか?または処理中に配列に追加する方法がありますか?これは実現可能ですか?

+0

あなたの入力は?その入力に期待する正確な出力は何ですか? –

+0

入力の例が追加されました(pastebinのリンクを参照)。 JFiddleのリンクは、私が出力のために見たいものの正確な例です。 – Parker

+0

そして、その入力の期待される出力は?それは平らな構造のようです。私はそこに上記の配列に関連するものは見ていない。 –

答えて

2

@lwburkの答えは良いですが、速度は2次です(O(N^2))。ここで

は、単純な、線速度(O(N))であるソリューション

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common"> 
<xsl:output method="text"/> 

<xsl:key name="kRowById" match="Row" 
    use="ID"/> 

<xsl:variable name="vRows" select="/*/*"/> 

<xsl:variable name="vTopIndex" select="1"/> 

<xsl:template match="Row" mode="pass1"> 
    <Row pos="{position()}"> 
    <xsl:copy-of select="node()"/> 
    </Row> 
</xsl:template> 

<xsl:variable name="vrtfPass1"> 
    <xsl:apply-templates select="/*/Row" mode="pass1"/> 
</xsl:variable> 

<xsl:variable name="vPass1" select= 
    "ext:node-set($vrtfPass1)/*"/> 

<xsl:template match="/"> 
    var map1 = [ <xsl:text/> 
    <xsl:apply-templates select="$vPass1"/> 
    <xsl:text>];</xsl:text> 
</xsl:template> 

<xsl:template match="Row"> 
    <xsl:if test="position() > 1">, </xsl:if> 
    <xsl:value-of select= 
    "key('kRowById', MasterID)/@pos 
    - 
    (MasterID = ID) 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

このXMLドキュメントに適用された場合(何もXML文書が質問にインラインで提供されませんでした!) :

<Rows> 
    <Row> 
     <ID>5600</ID> 
     <MasterID>5600</MasterID> 
     <Name>A Product</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>1</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5601</ID> 
     <MasterID>5600</MasterID> 
     <Name>Requirements Gathering</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>100</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5602</ID> 
     <MasterID>5600</MasterID> 
     <Name>Design</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5603</ID> 
     <MasterID>5600</MasterID> 
     <Name>Development</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5604</ID> 
     <MasterID>5600</MasterID> 
     <Name>Testing</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5605</ID> 
     <MasterID>5600</MasterID> 
     <Name>Documentation</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5606</ID> 
     <MasterID>5605</MasterID> 
     <Name>Special documentation</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5607</ID> 
     <MasterID>5600</MasterID> 
     <Name>Implementation</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
</Rows> 

指名手配、正しい結果が生成され

var map1 = [ 0, 1, 1, 1, 1, 1, 6, 1]; 

説明

  1. これは、2つのパスソリューションです。最初のパスでは、すべての要素をそのままの状態でコピーしますが、pos属性をすべてに追加します。この新しい属性の値は、その兄弟のうちのの相対位置です。要素です。私たちは出力し、このマスターのpos属性の値を(非常に高速(O(1))アクセス用のキーを使用して)そのマスターを取得し、すべてのための第二のパスで

1

次のスタイルシートは持っているそれに先行する各 に関するMasterID同じ:

var map1 = [0, 1, 1, 1, 1, 1, 6, 1]; 

<Rows> 
    <Row> 
     <ID>5600</ID> 
     <MasterID>5600</MasterID> 
     <Name>A Product</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>1</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5601</ID> 
     <MasterID>5600</MasterID> 
     <Name>Requirements Gathering</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>100</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5602</ID> 
     <MasterID>5600</MasterID> 
     <Name>Design</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5603</ID> 
     <MasterID>5600</MasterID> 
     <Name>Development</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5604</ID> 
     <MasterID>5600</MasterID> 
     <Name>Testing</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5605</ID> 
     <MasterID>5600</MasterID> 
     <Name>Documentation</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5606</ID> 
     <MasterID>5605</MasterID> 
     <Name>Special documentation</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
    <Row> 
     <ID>5607</ID> 
     <MasterID>5600</MasterID> 
     <Name>Implementation</Name> 
     <Owner>RyanB_Admin</Owner> 
     <CompletionPercentage>0</CompletionPercentage> 
    </Row> 
</Rows> 

は、以下の出力を生成します。この入力に印加

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <xsl:text>var map1 = [</xsl:text> 
     <xsl:apply-templates select="/*/Row"/> 
     <xsl:text>];</xsl:text> 
    </xsl:template> 
    <xsl:template match="Row[ID=MasterID]">0</xsl:template> 
    <xsl:template match="Row"> 
     <xsl:text>, </xsl:text> 
     <xsl:value-of select="count(preceding-sibling::Row[ 
      ID=current()/MasterID]/preceding-sibling::Row) + 1."/> 
    </xsl:template> 
</xsl:stylesheet> 

このテイク各要素のマスターを処理するときに参照する最も簡単な方法です。非常に大きな文書ではうまく機能しない可能性があります。

関連する問題