2013-03-22 42 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>