我可以为嵌套类别干这个XSLT吗?

时间:2011-11-19 22:24:59

标签: xslt xslt-1.0 symphony-cms

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>

三个不同级别的匹配之间的唯一区别是重复subcategoriesitem个节点。

我已经在他们自己的命名模板中成功获得了li,但有没有办法可以避免单独匹配这三个级别?

此外,似乎因为我在初始比赛中使用了一种模式,我还必须在所有后续比赛中使用该模式 - 这是正确的吗?

编辑:这是我在使用相对路径后想出的内容@ 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 :(得分:0)

您不需要在每个@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>