2011-01-06 53 views
1

我對基於960網格CSS框架的網站使用XSLT。XSLT根據位置應用屬性

我有跨越整個頁面的div列,如果它是一行中的第一個div它應該有一個類首先應用,如果它是中間一個然後沒有類,如果它是行中的第三個它應該最後應用這個類。

我真的很撓我的頭,因爲最好的方式去任何幫助表示讚賞。

下面是我想要結束的結構,div內的數字代表位置。

<div class="container_12"> 
    <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;"> 
     <div class="grid_4 alpha"> 
      1 
     </div> 
     <div class="grid_4 "> 
      2 
     </div> 
     <div class="grid_4 omega"> 
      3 
     </div> 
     <div class="grid_4 alpha"> 
      4 
     </div> 
    </div> 
</div> 
+2

我不喜歡一把umbraco問題,因爲他們遠非標準XSLT ...但我可以告訴你,你想用'mod`操作符:當$ position mod 3 = 1,然後是alpha,當$ position mod 3 = 0時,那麼歐米茄... – 2011-01-07 00:09:39

回答

1

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" exclude-result-prefixes="my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<my:classes> 
    <class class="omega"></class> 
    <class class="alpha"></class> 
    <class/> 
</my:classes> 

<xsl:variable name="vClasses" select= 
    "document('')/*/my:classes/*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="div[@id='main-content']/div"> 
    <xsl:variable name="vPos123" select= 
    "1 + (position() mod 3)"/> 
    <div class="{@class} {$vClasses[$vPos123]/@class}"> 

    <xsl:apply-templates select= 
    "node()|@*[not(name()='class')]"/> 
    </div> 
</xsl:template> 
</xsl:stylesheet> 

當下面的XML文檔應用:

<div class="container_12"> 
    <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;"> 
     <div class="grid_4"> 
        1 
     </div> 
     <div class="grid_4 "> 
        2 
     </div> 
     <div class="grid_4"> 
        3 
     </div> 
     <div class="grid_4"> 
        4 
     </div> 
    </div> 
</div> 

產生想要的,正確的結果

<div class="container_12"> 
    <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;"> 
     <div class="grid_4 alpha"> 
        1 
     </div> 
     <div class="grid_4 "> 
        2 
     </div> 
     <div class="grid_4 omega"> 
        3 
     </div> 
     <div class="grid_4 alpha"> 
        4 
     </div> 
    </div> 
</div> 

說明

  1. 身份規則副本的每個節點 「原樣」,除非被覆蓋。

  2. 的模板覆蓋的那種div[@id='main-content']/div

  3. 表達1 + (position() mod 3)的元素身份規則的位置映射到集合{2,3,1}。

  4. 上述表達式被用作索引入的孩子全局指定<my:classes>元件以提取新的CSS類被添加到div元件