2

誰かがこれを改善するのを手伝ってくれますか? もっと良い方法があるはずです。私がやっていることは、ツリー メニューを生成するために、flex が取得するローカル Web サービスを構築することです。私が Web サービスと呼んでいるアプリケーションである Flex は、背景にすぎませんが、問題とは何の関係もありません。

このツリーの階層データを作成するために、次のようにコーディングしました。

    <cffunction name="getFormsBinMenu" access="remote" returntype="string">
    <cfquery name="getParents" datasource="db_intranet_data">
        SELECT * FROM formsbin_categories WHERE parentid = 1 ORDER BY sortorder ASC
    </cfquery>

    <cfoutput>
        <cfxml variable="formsBinMenu">
            <?xml version='1.0' encoding='utf-8' ?>
            <folder label="Forms Bin">
                <cfloop query="getParents">
                    <folder label="#XMLFormat(getParents.catname)#">
                            <cfquery name="getSubParents" datasource="db_intranet_data">
                                SELECT * FROM formsbin_categories WHERE parentid = #catid# and testonly = 0 and visible = 1 ORDER BY sortorder ASC
                            </cfquery>
                            <cfloop query="getSubParents">
                                <folder label="#XMLFormat(getSubParents.catname)#">
                                          <cfquery name="getNextSubParents" datasource="db_intranet_data">
                                                SELECT * FROM formsbin_categories WHERE parentid = #catid# and testonly = 0 and visible = 1 ORDER BY sortorder ASC
                                            </cfquery>
                                            <cfloop query="getNextSubParents">
                                                <folder label="#XMLFormat(getNextSubParents.catname)#"/>
                                            </cfloop>                        
                                </folder>   
                            </cfloop>                                         
                    </folder>
                </cfloop>
            </folder>
        </cfxml>
    </cfoutput>

    <cfset menu =  #toString(formsBinMenu)#>
    <cfreturn menu>
</cffunction>

ご覧のとおり、さまざまなクエリをループしているだけです。これは私の目的には合っていますが、コードの繰り返しがあまりないようにするにはどうすればよいでしょうか?

構造の深さが何レベルになるかを確認してから、すべてをインデックス ループで実行することを考えましたが、それでもオーバーヘッドが大きすぎるようです。

どんな提案も素晴らしいでしょう!

4

1 に答える 1

2

xslt 変換を使用して作成したコードを見てください。コードで同じアプローチを使用できると確信しています (クエリの parentID は brandID の外部キーであることに注意してください)。

<cfquery name="queryBrands" datasource="#dsn#">
    SELECT brandID, brand, isAssignable, isnull(parentID, 0) AS parentID, abbreviation
    FROM dbo.BrandTree
</cfquery>


<cfxml variable="rawNodeTree">
    <cfoutput>
        <nodes>
            <cfloop query="queryBrands">
                <node id="#queryBrands.brandID#"
                      parentID="#queryBrands.parentID#"
                      name="#XmlFormat(queryBrands.brand)#"
                      isAssignable="#queryBrands.isAssignable#"
                      abbreviation="#queryBrands.abbreviation#" />
            </cfloop>
        </nodes>
    </cfoutput>
</cfxml>

<cfxml variable="xslt">
    <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="/nodes">
            <nodes>
                <xsl:call-template name="getChildNodes" />
            </nodes>
        </xsl:template>

        <xsl:template name="getChildNodes">
            <xsl:param name="parentID" select="0" />

            <xsl:for-each select="//node[ @parentID = $parentID ]">
                <xsl:sort select="@name" />

                <node id="{@id}"
                      parentID="{@parentID}"
                      name="{@name}"
                      isAssignable="{@isAssignable}"
                      abbreviation="{@abbreviation}">
                      <xsl:call-template name="getChildNodes">
                        <xsl:with-param name="parentID" select="@id" />
                      </xsl:call-template>
                </node>
            </xsl:for-each>
        </xsl:template>
    </xsl:transform>
</cfxml>

<cfset result = xmlTransform(rawNodeTree, xslt) />

この同じ問題を解決する方法を調査していたとき、私はhttp://www.bennadel.com/blog/1080-Recursive-XSLT-For-Nested-XML-Nodes-In-ColdFusion.htmを使用して助けてくれたと思います。

別のオプションは、クエリにCTEを使用し、そのフィールドを使用して xml を構築することです。(ms sql サーバーを使用している場合)

于 2011-02-28T21:14:55.670 に答える