2011-03-06 5 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에 부모라고 주장하는 다른 태그가있는 경우이 어린이는 각 인스턴스에서 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. 같은 이름의 두 번째 키 :

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

자신의 parents 형제의 item 아이의handle 속성의 값에 의해 tag 일치합니다. 이렇게하면 tag이 모든 "부모"에 대해 나열 될 수 있습니다.

같은 이름으로 여러 개의 키를 가질 수있는 기능은 매우 강력하고 유용한 기능입니다.

+0

위대한 작품과 훨씬 더 짧습니다! –

+0

@ Kirk-Strobeck : 천만에. –

+0

나는 그것을 통합했지만 단 하나의 질문이있었습니다. 그것은 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

그것은 훌륭한 해결책입니다! 정말 고마워! 나는 당신의 방법을 통해 배워야 만합니다. 나는 그것을 통합했지만 단 하나의 질문이있었습니다. 그것은 UL의 각 사례에서 중복되는 것처럼 보이지 않습니다. 예를 들어'바누아투 제도 '가'임무 '와'중등부 사역 '을 부모로 주장한다면 ... http://see.weareinto.com/525q –

+0

@Kirk Strobeck : 천만에요. 내 업데이트를 확인하십시오. –