2011-11-19 59 views
0

可用的XSLT是1.0。我可以爲嵌套類別製作這個XSLT嗎?

下面的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,但是有沒有辦法可以避免單獨匹配三個級別?

另外,它似乎是因爲我在初始匹配時使用了一種模式,所以我也必須在隨後的所有匹配中使用該模式 - 是對的嗎?

編輯:這裏就是我想出了使用相對路徑作爲@邁克爾的回答後:

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

所有你'的xsl:用'mode'屬性呼叫template'指令在XSLT語法非法的(如:\t'的'和另外兩個) - 您的轉換引發錯誤,無法處理。請改正。 –

+0

@DimitreNovatchev,謝謝 - 我沒有得到錯誤,所以不知道。已刪除模式。 –

回答

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

謝謝 - DRY'ed現在工作。似乎我需要添加一些額外的邏輯來處理空的「子類別」節點 - 我已經將新的XSLT添加到了我的問題中。 –