2013-01-04 50 views
0

我一直在爲我的腦子好幾天了,對於我的生活,我無法弄清楚如何實現這一點。看看下面的XML:重複屬性之間的XSLT組兄弟元素

<Root> 
    <container> 
     <widget type="nav"> 
      <links> 
       <tab type="label" header="Top Level Tab1"/> 
       <tab type="page" header="submenu of tab1"/> 
       <tab type="page" header="submenu of tab1"/> 
       <tab type="page" header="submenu of tab1"/> 
       <tab type="label" header="Top Level Tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="label" header="Top Level Tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
      </links> 
     </widget> 
    </container> 
</root> 

我需要做的是將其轉化成一個導航區域在與「標籤」,並把下面的兄弟姐妹在它之下的類型每個選項卡分隔條件。例如

<ul> 
    <li> 
     <a href="link for label">Top Level Header1</a> 
     <div class="submenu"> 
      <ul> 
       <li>Submenu Link 1</li> 
       <li>Submenu Link 1</li> 
       <li>Submenu Link 1</li> 
      </ul> 
     </div> 
    </li> 
    <li> 
     <a href="link for label">Top Level Header2</a> 
     <div class="submenu"> 
      <ul> 
       <li>Submenu Link 2</li> 
       <li>Submenu Link 2</li> 
       <li>Submenu Link 2</li> 
      </ul> 
     </div> 
    </li> 
    <li> 
     <a href="link for label">Top Level Header3</a> 
     <div class="submenu"> 
      <ul> 
       <li>Submenu Link 3</li> 
       <li>Submenu Link 3</li> 
       <li>Submenu Link 3</li> 
      </ul> 
     </div> 
    </li> 
</ul> 

任何指導肯定會理解

回答

1

井的XPath允許用戶選擇與相應的軸下面或前述同級元素。而且爲了提高效率,你可以使用一鍵:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:key name="subs" match="widget[@type = 'nav']/links/tab[@type = 'page']" 
    use="generate-id(preceding-sibling::tab[@type = 'label'][1])"/> 

<xsl:output method="html" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="container/widget[@type = 'nav']"> 
    <ul> 
    <xsl:apply-templates select="links/tab[@type = 'label' and starts-with(@header, 'Top Level')]"/> 
    </ul> 
</xsl:template> 

<xsl:template match="links/tab[@type = 'label' and starts-with(@header, 'Top Level')]"> 
    <li> 
    <a href="link for label"> 
     <xsl:value-of select="@header"/> 
    </a> 
    <div class="submenu"> 
     <ul> 
     <xsl:apply-templates select="key('subs', generate-id())"/> 
     </ul> 
    </div> 
    </li> 
</xsl:template> 

<xsl:template match="links/tab[@type = 'page']"> 
    <li> 
    <xsl:value-of select="@header"/> 
    </li> 
</xsl:template> 

</xsl:stylesheet> 

這樣式錶轉換

<Root> 
    <container> 
     <widget type="nav"> 
      <links> 
       <tab type="label" header="Top Level Tab1"/> 
       <tab type="page" header="submenu of tab1"/> 
       <tab type="page" header="submenu of tab1"/> 
       <tab type="page" header="submenu of tab1"/> 
       <tab type="label" header="Top Level Tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="page" header="submenu of tab2"/> 
       <tab type="label" header="Top Level Tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
       <tab type="page" header="submenu of tab3"/> 
      </links> 
     </widget> 
    </container> 
</Root> 

<ul> 
    <li><a href="link for label">Top Level Tab1</a><div class="submenu"> 
     <ul> 
      <li>submenu of tab1</li> 
      <li>submenu of tab1</li> 
      <li>submenu of tab1</li> 
     </ul> 
     </div> 
    </li> 
    <li><a href="link for label">Top Level Tab2</a><div class="submenu"> 
     <ul> 
      <li>submenu of tab2</li> 
      <li>submenu of tab2</li> 
      <li>submenu of tab2</li> 
      <li>submenu of tab2</li> 
      <li>submenu of tab2</li> 
     </ul> 
     </div> 
    </li> 
    <li><a href="link for label">Top Level Tab3</a><div class="submenu"> 
     <ul> 
      <li>submenu of tab3</li> 
      <li>submenu of tab3</li> 
      <li>submenu of tab3</li> 
      <li>submenu of tab3</li> 
      <li>submenu of tab3</li> 
     </ul> 
     </div> 
    </li> 
</ul> 
+0

非常感謝你爲這個,我不得不修改了一下,以適應現實樣式表的影響,但這是100%的點,我所需要的!謝謝! –