2011-03-06 14 views
1

私はこのデータをクライアント用に持っています(以下を参照)、任意の数の層を持つことができる箇条書きリストを作成したいと思います。私はまた、項目が複数回リストアップされるという側面では動的であることを望んでいます。 CMSは、TAGがその親を主張するように設定されています。 TAGがその親を主張しているところでは、その子供はその下に複製する必要があります。 XSLTでこれに取り組むために、単純な例では、このような何かを探して終わるべきかわからない。..動的カスケードリストを作成しようとしています

<ul> 
    <li>Missions</li> 
    <li> 
     <ul> 
      <li>Kampala, Uganda</li> 
      <li>Lima, Peru</li> 
     </ul> 
    </li> 
</ul> 

Kampala, Uganda場合も親として何かを主張し、それが複数回表示されます。 Kampala, Ugandaに親として主張している他のTAGSがある場合、これらの子供はそれぞれのインスタンスでKampala, Ugandaの下にカスケードします。

<data> 
<tags> 
    <section id="3" handle="tags">Tags</section> 
    <entry id="72"> 
     <parents> 
      <item handle="meetings">Meetings</item> 
     </parents> 
     <tag handle="bible-studies">Bible studies</tag> 
    </entry> 
    <entry id="51"> 
     <parents> 
      <item handle="missions">Missions</item> 
     </parents> 
     <tag handle="brazil">Brazil</tag> 
    </entry> 
    <entry id="31"> 
     <parents> 
      <item handle="ministry">Ministry</item> 
     </parents> 
     <tag handle="childrens-ministry">Children's ministry</tag> 
    </entry> 
    <entry id="28"> 
     <parents> 
      <item handle="ministry">Ministry</item> 
     </parents> 
     <tag handle="college-and-career-ministry">College and Career ministry</tag> 
    </entry> 
    <entry id="56"> 
     <parents> 
      <item handle="the-islands-of-vanuatu">The Islands of Vanuatu</item> 
     </parents> 
     <tag handle="fanafo-christian-fellowship">Fanafo Christian Fellowship</tag> 
    </entry> 
    <entry id="29"> 
     <parents> 
      <item handle="ministry">Ministry</item> 
     </parents> 
     <tag handle="high-school-ministry">High School ministry</tag> 
    </entry> 
    <entry id="48"> 
     <parents> 
      <item handle="missions">Missions</item> 
     </parents> 
     <tag handle="holsbybrunn-sweden">Holsbybrunn, Sweden</tag> 
    </entry> 
    <entry id="22"> 
     <tag handle="home">Home</tag> 
    </entry> 
    <entry id="19"> 
     <tag handle="israel">Israel</tag> 
    </entry> 
    <entry id="30"> 
     <parents> 
      <item handle="ministry">Ministry</item> 
     </parents> 
     <tag handle="junior-high-ministry">Junior High ministry</tag> 
    </entry> 
    <entry id="47"> 
     <parents> 
      <item handle="missions">Missions</item> 
     </parents> 
     <tag handle="kampala-uganda">Kampala, Uganda</tag> 
    </entry> 
    <entry id="49"> 
     <parents> 
      <item handle="missions">Missions</item> 
     </parents> 
     <tag handle="lima-peru">Lima, Peru</tag> 
    </entry> 
    <entry id="64"> 
     <parents> 
      <item handle="" /> 
     </parents> 
     <tag handle="meetings">Meetings</tag> 
    </entry> 
    <entry id="32"> 
     <parents> 
      <item handle="ministry">Ministry</item> 
     </parents> 
     <tag handle="men-s-ministry">Men’s ministry</tag> 
    </entry> 
    <entry id="44"> 
     <parents> 
      <item handle="" /> 
     </parents> 
     <tag handle="ministry">Ministry</tag> 
    </entry> 
    <entry id="33"> 
     <tag handle="missions">Missions</tag> 
    </entry> 
    <entry id="54"> 
     <parents> 
      <item handle="the-islands-of-vanuatu">The Islands of Vanuatu</item> 
     </parents> 
     <tag handle="natanara-christian-fellowship">Natanara Christian Fellowship</tag> 
    </entry> 
    <entry id="50"> 
     <parents> 
      <item handle="missions">Missions</item> 
     </parents> 
     <tag handle="ouagadougou-burkina-faso">Ouagadougou, Burkina Faso</tag> 
    </entry> 
    <entry id="46"> 
     <parents> 
      <item handle="missions">Missions</item> 
     </parents> 
     <tag handle="the-islands-of-vanuatu">The Islands of Vanuatu</tag> 
    </entry> 
    <entry id="77"> 
     <parents> 
      <item handle="missions">Missions</item> 
     </parents> 
     <tag handle="villahermosa-mexico">Villahermosa, Mexico</tag> 
    </entry> 
    <entry id="27"> 
     <parents> 
      <item handle="ministry">Ministry</item> 
     </parents> 
     <tag handle="womens-ministry">Women's ministry</tag> 
    </entry> 
    <entry id="73"> 
     <parents> 
      <item handle="meetings">Meetings</item> 
     </parents> 
     <tag handle="worship">Worship</tag> 
    </entry> 
</tags> 

+0

良い質問、+1。 @Alejandroのものより少し単純で短い解決策(全くパラメータを必要としない)については私の答えを見てください。 :) –

+0

@ Kirk-Strobeck:私は自分の答えを更新しました。そして、 'tag'が複数の親を持つとき、正しい結果が生成されるようになりました。繰り返しますが、これは簡単で短く、パラメータを使用せず、 ''の基本的な機能に基づいています。 –

答えて

1

商品の子供が別の<li>に梱包される必要はありません。

この変換(非常@Alejandroのと同様の、しかしより簡単な、より短い任意のパラメータで全てを必要としない)

:ソースXML文書と呼ぶ上に塗布

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:key name="kChildren" match="tag" 
       use="string(../parents/item/@handle)"/> 

    <xsl:key name="kChildren" match="tag" 
       use="../parents/item/@handle"/> 

    <xsl:template match="/" name="buildChildrenList"> 
     <xsl:variable name="vChildren" select= 
     "key('kChildren', string(@handle))"/> 

     <xsl:if test="$vChildren"> 
      <ul> 
       <xsl:apply-templates select="$vChildren"/> 
      </ul> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="tag"> 
     <li> 
      <xsl:value-of select="."/> 
      <xsl:call-template name="buildChildrenList"/> 
     </li> 
    </xsl:template> 
</xsl:stylesheet> 

<data> 
    <tags> 
     <section id="3" handle="tags">Tags</section> 
     <entry id="72"> 
      <parents> 
       <item handle="meetings">Meetings</item> 
      </parents> 
      <tag handle="bible-studies">Bible studies</tag> 
     </entry> 
     <entry id="51"> 
      <parents> 
       <item handle="missions">Missions</item> 
      </parents> 
      <tag handle="brazil">Brazil</tag> 
     </entry> 
     <entry id="31"> 
      <parents> 
       <item handle="ministry">Ministry</item> 
      </parents> 
      <tag handle="childrens-ministry">Children's ministry</tag> 
     </entry> 
     <entry id="28"> 
      <parents> 
       <item handle="ministry">Ministry</item> 
      </parents> 
      <tag handle="college-and-career-ministry">College and Career ministry</tag> 
     </entry> 
     <entry id="56"> 
      <parents> 
       <item handle="the-islands-of-vanuatu">The Islands of Vanuatu</item> 
      </parents> 
      <tag handle="fanafo-christian-fellowship">Fanafo Christian Fellowship</tag> 
     </entry> 
     <entry id="29"> 
      <parents> 
       <item handle="ministry">Ministry</item> 
      </parents> 
      <tag handle="high-school-ministry">High School ministry</tag> 
     </entry> 
     <entry id="48"> 
      <parents> 
       <item handle="missions">Missions</item> 
      </parents> 
      <tag handle="holsbybrunn-sweden">Holsbybrunn, Sweden</tag> 
     </entry> 
     <entry id="22"> 
      <tag handle="home">Home</tag> 
     </entry> 
     <entry id="19"> 
      <tag handle="israel">Israel</tag> 
     </entry> 
     <entry id="30"> 
      <parents> 
       <item handle="ministry">Ministry</item> 
      </parents> 
      <tag handle="junior-high-ministry">Junior High ministry</tag> 
     </entry> 
     <entry id="47"> 
      <parents> 
       <item handle="missions">Missions</item> 
      </parents> 
      <tag handle="kampala-uganda">Kampala, Uganda</tag> 
     </entry> 
     <entry id="49"> 
      <parents> 
       <item handle="missions">Missions</item> 
      </parents> 
      <tag handle="lima-peru">Lima, Peru</tag> 
     </entry> 
     <entry id="64"> 
      <parents> 
       <item handle="" /> 
      </parents> 
      <tag handle="meetings">Meetings</tag> 
     </entry> 
     <entry id="32"> 
      <parents> 
       <item handle="ministry">Ministry</item> 
      </parents> 
      <tag handle="men-s-ministry">Men’s ministry</tag> 
     </entry> 
     <entry id="44"> 
      <parents> 
       <item handle="" /> 
      </parents> 
      <tag handle="ministry">Ministry</tag> 
     </entry> 
     <entry id="33"> 
      <parents> 
       <item handle="" /> 
      </parents> 
      <tag handle="missions">Missions</tag> 
     </entry> 
     <entry id="54"> 
      <parents> 
       <item handle="the-islands-of-vanuatu">The Islands of Vanuatu</item> 
      </parents> 
      <tag handle="natanara-christian-fellowship">Natanara Christian Fellowship</tag> 
     </entry> 
     <entry id="50"> 
      <parents> 
       <item handle="missions">Missions</item> 
      </parents> 
      <tag handle="ouagadougou-burkina-faso">Ouagadougou, Burkina Faso</tag> 
     </entry> 
     <entry id="46"> 
      <parents> 
       <item handle="junior-high-ministry">Junior High ministry</item> 
       <item handle="missions">Missions</item> 
      </parents> 
      <tag handle="the-islands-of-vanuatu">The Islands of Vanuatu</tag> 
     </entry> 
     <entry id="77"> 
      <parents> 
       <item handle="missions">Missions</item> 
      </parents> 
      <tag handle="villahermosa-mexico">Villahermosa, Mexico</tag> 
     </entry> 
     <entry id="27"> 
      <parents> 
       <item handle="ministry">Ministry</item> 
      </parents> 
      <tag handle="womens-ministry">Women's ministry</tag> 
     </entry> 
     <entry id="73"> 
      <parents> 
       <item handle="meetings">Meetings</item> 
      </parents> 
      <tag handle="worship">Worship</tag> 
     </entry> 
    </tags> 
</data> 

は指名手配、正しい結果を生成します0

<ul> <li>Home</li> <li>Israel</li> <li>Meetings <ul> <li>Bible studies</li> <li>Worship</li> </ul></li> <li>Ministry <ul> <li>Children's ministry</li> <li>College and Career ministry</li> <li>High School ministry</li> <li>Junior High ministry <ul> <li>The Islands of Vanuatu <ul> <li>Fanafo Christian Fellowship</li> <li>Natanara Christian Fellowship</li> </ul></li> </ul></li> <li>Men’s ministry</li> <li>Women's ministry</li> </ul></li> <li>Missions <ul> <li>Brazil</li> <li>Holsbybrunn, Sweden</li> <li>Kampala, Uganda</li> <li>Lima, Peru</li> <li>Ouagadougou, Burkina Faso</li> <li>The Islands of Vanuatu <ul> <li>Fanafo Christian Fellowship</li> <li>Natanara Christian Fellowship</li> </ul></li> <li>Villahermosa, Mexico</li> </ul></li> </ul> 

注記tagに複数の親がある場合、このソリューションは正しく動作します。

説明

  1. キー:

<xsl:key name="kChildren" match="tag" use="string(../parents/item/@handle)"/>

最初(のhandle属性の文字列値から全ての "子ども" を生成のみ)item彼らのparents兄弟です。これはまた、parents兄弟(この場合、キー値は空の文字列)を持たないそのようなtag要素を網羅しています。

.2。同じ名前を持つ2番目のキー:

<xsl:key name="kChildren" match="tag" 
      use="../parents/item/@handle"/> 

は、彼らのparents兄弟のitem子の任意のhandle属性の値によってtagと一致します。これにより、最初のものだけでなく、すべての "親"についてtagをリストすることができます。

同じ名前の複数のキーを持つ機能は、非常に強力で便利な機能です。

+0

素晴らしい作品、はるかに短い! –

+0

@ Kirk-Strobeck:どうぞよろしくお願いいたします。 –

+0

私はそれを統合しましたが、質問が1つしかありません。ULの各インスタンスで重複しているようには見えません。たとえば、バヌアツ諸島がミッションと中学の両方の教区を親として主張しているとします。例を反映したデータセットがあります。see.weareinto.com/525q –

1

編集:複数の両親の関係が追加されました。

このスタイルシート:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kTagByParent" 
      match="tag" 
      use="../parents/item/@handle"/> 
    <xsl:template match="/" name="makeUL"> 
     <xsl:param name="pChilds" 
        select="*/*/entry[not(parents/item/@handle!='')]/tag"/> 
     <ul> 
      <xsl:apply-templates select="$pChilds"/> 
     </ul> 
    </xsl:template> 
    <xsl:template match="tag"> 
     <xsl:variable name="vChilds" select="key('kTagByParent',@handle)"/> 
     <li> 
      <xsl:value-of select="@handle"/> 
     </li> 
     <xsl:if test="$vChilds"> 
      <li> 
       <xsl:call-template name="makeUL"> 
        <xsl:with-param name="pChilds" select="$vChilds"/> 
       </xsl:call-template> 
      </li> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

出力:http://see.weareinto.com/525qで新しい提供された入力で

<ul> 
    <li>home</li> 
    <li>israel</li> 
    <li>meetings</li> 
    <li> 
     <ul> 
      <li>bible-studies</li> 
      <li>worship</li> 
     </ul> 
    </li> 
    <li>ministry</li> 
    <li> 
     <ul> 
      <li>childrens-ministry</li> 
      <li>college-and-career-ministry</li> 
      <li>high-school-ministry</li> 
      <li>junior-high-ministry</li> 
      <li>men-s-ministry</li> 
      <li>womens-ministry</li> 
     </ul> 
    </li> 
    <li>missions</li> 
    <li> 
     <ul> 
      <li>brazil</li> 
      <li>holsbybrunn-sweden</li> 
      <li>kampala-uganda</li> 
      <li>lima-peru</li> 
      <li>ouagadougou-burkina-faso</li> 
      <li>the-islands-of-vanuatu</li> 
      <li> 
       <ul> 
        <li>fanafo-christian-fellowship</li> 
        <li>natanara-christian-fellowship</li> 
       </ul> 
      </li> 
      <li>villahermosa-mexico</li> 
     </ul> 
    </li> 
</ul> 

、出力:

<ul> 
    <li>home</li> 
    <li>israel</li> 
    <li>meetings</li> 
    <li> 
     <ul> 
      <li>bible-studies</li> 
      <li>worship</li> 
     </ul></li> 
    <li>ministry</li> 
    <li> 
     <ul> 
      <li>childrens-ministry</li> 
      <li>college-and-career-ministry</li> 
      <li>high-school-ministry</li> 
      <li>junior-high-ministry</li> 
      <li> 
       <ul> 
        <li>the-islands-of-vanuatu</li> 
        <li> 
         <ul> 
          <li>fanafo-christian-fellowship</li> 
          <li>natanara-christian-fellowship</li> 
         </ul> 
        </li> 
       </ul> 
      </li> 
      <li>men-s-ministry</li> 
      <li>womens-ministry</li> 
     </ul></li> 
    <li>missions</li> 
    <li> 
     <ul> 
      <li>brazil</li> 
      <li>holsbybrunn-sweden</li> 
      <li>kampala-uganda</li> 
      <li>lima-peru</li> 
      <li>ouagadougou-burkina-faso</li> 
      <li>the-islands-of-vanuatu</li> 
      <li> 
       <ul> 
        <li>fanafo-christian-fellowship</li> 
        <li>natanara-christian-fellowship</li> 
       </ul> 
      </li> 
      <li>villahermosa-mexico</li> 
     </ul> 
    </li> 
</ul> 

注:ノードは、キー値を設定し、新表現を根にする。

+0

それは素晴らしい解決策です!本当にありがとう!私は学ぶためにあなたの方法を見なければならないでしょう。私はそれを統合しましたが、1つの質問だけがありました..それはULの各インスタンスで重複していないようです。たとえば、「バヌアツ諸島」が「ミッション」と「中学校」の両方を親として主張しているとします。http://see.weareinto.com/525q –

+0

@Kirk Strobeckの例を反映したデータセットがあります。どういたしまして。私の更新を確認してください。 –

関連する問題