0

私は何日も頭を悩ませてきましたが、私の人生では、これを達成する方法がわかりません. 次の XML を使用します。

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

任意のガイダンスは確かに高く評価されます

4

1 に答える 1

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>
于 2013-01-04T16:18:58.460 に答える