2011-03-06 143 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更简单,更简单的解决方案(根本不需要参数)。 :) – 2011-03-06 20:58:07

+0

@ Kirk-Strobeck:我已经更新了我的答案,现在当'tag'具有多个父代时产生正确的结果。再次,它更简单和更短,不使用任何参数,并且基于''的一些基本特征。 – 2011-03-06 22:46:56

回答

1

我不认为你需要一个项目的孩子被包裹在另一个<li>

该转化(相当类似于@Alejandro的,但更简单,更短并且不需要任何参数在所有):

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

当在称为源XML文档应用:

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

产生想要的,正确的结果:

<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"/> 

item孩子自己parents兄弟中的任何handle属性值相匹配的tag。这使得有可能为所有“父母”列出tag,而不仅仅是第一个。

正如我们在这里看到的,具有多个具有相同名称的键的能力是一个非常强大和有用的功能。

+0

工程很棒,而且更短! – 2011-03-06 21:04:36

+0

@ Kirk-Strobeck:不客气。 – 2011-03-06 21:06:29

+0

我已经整合了它,但只有一个问题。在UL的每个实例中似乎都没有重复。例如,如果瓦努阿图群岛声称两国的特派团和初等教育部门都是父母。这里有一个反映这个例子的数据集see.weareinto.com/525q – 2011-03-06 21:06:34

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> 

输出:

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

随着新提供的输入在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> 
       <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 – 2011-03-06 20:10:53

+0

@Kirk Strobeck:不用谢。检查我的更新。 – 2011-03-06 20:42:11