Могу ли я СУШИТЬ этот XSLT для вложенных категорий? - PullRequest
0 голосов
/ 20 ноября 2011

XSLT доступно 1.0.

XML и XSLT ниже предназначены для построения выпадающего меню навигации для вложенных категорий.Уровень категорий может различаться.

Пример XML:

<data>
  <categories-nav>
     <section id="11" handle="categories-1">Categories 1</section>
     <entry id="65">
       <name handle="air-rifles">Air Rifles</name>
       <subcategories field-id="50" subsection-id="12" items="2">
         <item id="66" quantity="1">
           <name handle="rifles">Rifles</name>
           <active>Yes</active>
           <subcategories field-id="57" subsection-id="13" items="2">
             <item id="67" quantity="1">
               <name handle="b2-series">B2 Series</name>
               <active>Yes</active>
             </item>
             <item id="112" quantity="1">
               <name handle="junior-supergrade">Junior Supergrade</name>
               <active>Yes</active>
             </item>
           </subcategories>
         </item>
         <item id="111" quantity="1">
           <name handle="accessories">Accessories</name>
           <active>Yes</active>
           <subcategories field-id="57" subsection-id="13" items="0" />
         </item>
       </subcategories>
     </entry>
     <entry id="118">
       <name handle="pistols">Pistols</name>
     </entry>
     <entry id="58">
       <name handle="bb-softair-guns">BB Softair Guns</name>
     </entry>
  </categories-nav>
</data>

Мой текущий XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="categories-nav-entries" mode="navigation">
    <li class="{name/@handle}-{@id}">
        <a href="/cat/{@id}/{name/@handle}/"><xsl:value-of select="name"/></a>
        <xsl:apply-templates select="subcategories" mode="navigation"/>
    </li>
</xsl:template>

<!-- level 1 -->

<xsl:template match="/data/categories-nav" mode="navigation">
    <ul>
        <xsl:apply-templates select="entry" mode="navigation"/>
    </ul>
</xsl:template>

<xsl:template match="/data/categories-nav/entry" mode="navigation">
    <xsl:call-template name="categories-nav-entries" mode="navigation"/>
</xsl:template>

<!-- level 2 -->

<xsl:template match="/data/categories-nav/entry/subcategories" mode="navigation">
    <ul>
        <xsl:apply-templates select="item" mode="navigation"/>
    </ul>
</xsl:template>

<xsl:template match="/data/categories-nav/entry/subcategories/item" mode="navigation">
    <xsl:call-template name="categories-nav-entries" mode="navigation"/>
</xsl:template>

<!-- level 3 -->

<xsl:template match="/data/categories-nav/entry/subcategories/item/subcategories" mode="navigation">
    <ul>
        <xsl:apply-templates select="item" mode="navigation"/>
    </ul>
</xsl:template>

<xsl:template match="/data/categories-nav/entry/subcategories/item/subcategories/item" mode="navigation">
    <xsl:call-template name="categories-nav-entries" mode="navigation"/>
</xsl:template>

</xsl:stylesheet>

Единственная разница между совпадениями для трех разных уровнейповторяющиеся узлы subcategories и item.

Я успешно получил li s в их собственном именованном шаблоне, но есть ли способ избежать совпадения трех уровней отдельно?

Кроме того, кажется, что, поскольку я использую режим на начальном совпадении, я также должен использовать этот режим на всех последующих совпадениях - это правильно?

Правка: здесьчто я придумал после использования относительных путей в качестве ответа @ michael:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="categories-nav-list">
    <li class="{name/@handle}">
        <a href="/cat/{@id}/{name/@handle}/"><xsl:value-of select="name"/></a>
        <xsl:apply-templates select="subcategories[@items > 0]"/>
    </li>
</xsl:template>

<xsl:template match="categories-nav">
    <ul>
        <xsl:apply-templates select="entry"/>
    </ul>
</xsl:template>

<xsl:template match="categories-nav/entry">
    <xsl:call-template name="categories-nav-list"/>
</xsl:template>

<xsl:template match="categories-nav//subcategories[item/active='Yes']">
    <ul>
        <xsl:apply-templates select="item"/>
    </ul>
</xsl:template>

<xsl:template match="categories-nav//subcategories/item[active='Yes']" priority="1">
    <xsl:call-template name="categories-nav-list"/>
</xsl:template>

<xsl:template match="categories-nav//subcategories/item" priority="0"/>

</xsl:stylesheet>

1 Ответ

0 голосов
/ 20 ноября 2011

Вам не нужно указывать абсолютные пути в каждом атрибуте @match.

Почему бы не что-то вроде этого:

<xsl:template match="subcategories">
  <ul>
    <xsl:apply-templates select="item"/>
  </ul>
</xsl:template>

<xsl:template match="item">
  <xsl:call-template name="categories-nav-entries"/>
</xsl:template>
...