2013-03-22 74 views
0

我新使用Umbraco和XSLT。我不遠離學校,我們在那裏學習了vb.net和asp.net。現在我正在爲我們的地方教會做一個免費的網站。他們希望員工頁面,所以這裏是我的第一個解決方案...通過兒童進行XSLT循環並將每行放入表2個孩子?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]> 
<xsl:stylesheet 
version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxml="urn:schemas-microsoft-com:xslt" 
xmlns:umbraco.library="urn:umbraco.library"xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" 

xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" xmlns:umbraco.contour="urn:umbraco.contour" xmlns:tagsLib="urn:tagsLib" xmlns:BlogLibrary="urn:BlogLibrary" 
    exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets umbraco.contour tagsLib BlogLibrary "> 

<xsl:output method="xml" omit-xml-declaration="yes"/> 

<xsl:param name="currentPage"/> 

<xsl:template match="/"> 

<div class="staffList"> 
<xsl:for-each select="$currentPage/* [@isDoc and string(umbracoNaviHide) != '1']"> 

<img src="{staffPhoto}" width="210" height="280"/> 
<p class="introduction"><xsl:value-of select="umbraco.library:ReplaceLineBreaks(staffName)" disable-output-escaping="yes"/></p>  
<p class="introduction"><xsl:value-of select="umbraco.library:ReplaceLineBreaks(position)" disable-output-escaping="yes"/></p> 

</xsl:for-each> 
</div> 

</xsl:template> 

</xsl:stylesheet> 

這就是我設法迄今獲得的工作,但只是列出了他們在同一時間下來DIV之一。我希望減少該頁面的滾動量,並有空間在表中列出每行兩個。在今天的工作中環顧四周後,我仍然沒有開發出一個循環,將每個孩子的三條信息放在一個表格單元中。

我希望它是這樣的,但是這是在示數國防部5

<div class="staffList"> 
<table> 
<xsl:for-each select="$currentPage/*[position()mod5=1]"> 
<xsl:variable name = "current-pos" select="(position()-1) * 5+1"/> 
<tr> 
<xsl:for-each select="$currentPage/*[position()&gt;=$current-pos and position() &lt; $current-pos+5]" > 
<td> 
<xsl:value-of select="staffName"/> 
</td> 
</xsl:for-each> 
</tr>   
</xsl:for-each>   
</table> 
</div> 

螞蟻方向會有所幫助。就像我說過的這個XSLT對我來說是全新的,而且所有的同時我都試圖把我的頭圍繞在Umbraco的一切中,這對我來說是新的。在這裏學習跟蹤和錯誤。

在此先感謝您的幫助。 Dan

+0

我打算用[可重複使用的XSL樣式表和模板(http://www.tonymarston.net/xml-xsl/reusable-xsl啓動XSLT .html)文章和[動態XSL轉換](http://aspalliance.com/511_A_Dynamic_XSL_Transformation.3)。其他參考 - [在xsl 1.0中移動行數據](http://stackoverflow.com/questions/15539332/shifting-row-data-in-xsl-1-0) – Lijo 2014-05-09 14:07:01

回答

0

看起來您正在接收該錯誤,因爲您需要在單詞「mod」之前和之後放置空格。在另一方面,你正在使用的approcach有點程序化,並有一個稍微更優雅的方式,像這樣:

<div class="staffList"> 
    <table> 
    <xsl:apply-templates select="$currentPage/*[position() mod 5 = 1]" mode="row" /> 
    </table> 
</div> 

<!-- Separate templates --> 
<xsl:template match="*" mode="row"> 
    <tr> 
    <xsl:apply-templates select=". | following-sibling::*[position() &lt; 5" 
         mode="cell" /> 
    </tr>   
</xsl:template> 

<xsl:template match="*" mode="cell"> 
    <td> 
    <xsl:value-of select="staffName"/> 
    </td> 
</xsl:template> 

這不承擔儘管$currentPage僅僅是XML源文檔中的某些單個元素。如果不是的話,你仍然可以做到這一點:

<div class="staffList"> 
    <table> 
    <xsl:for-each select="$currentPage/*[position() mod 5=1]"> 
     <xsl:variable name = "current-pos" select="(position()-1) * 5+1"/> 
     <tr> 
     <xsl:apply-templates 
      select="($currentPage/*)[position() &gt;= $currentPos and 
            position() &lt; $current-pos + 5]" 
      mode="cell"/>    
     </tr> 
    </xsl:for-each> 
    </table> 
</div> 

<xsl:template match="*" mode="cell"> 
    <td> 
    <xsl:value-of select="staffName"/> 
    </td> 
</xsl:template>