我是使用Umbraco和XSLT的新手。我不远离学校,我们在那里学习了vb.net和asp.net。现在我正在为我们当地的教堂做一个免费的网站。他们想要一个员工页面,所以这是我的第一个解决方案...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
<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中一次列出一个。我希望减少该页面上的滚动量,并有空间在表格中列出每行两个。在今天工作的同时环顾四周,我仍然没有开发出一个循环,将每个孩子的三个信息放在一个表格单元格中。
我希望它是这样的,但这在mod 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()>=$current-pos and position() < $current-pos+5]" >
<td>
<xsl:value-of select="staffName"/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</div>
蚂蚁方向会有所帮助。就像我说的那样,XSLT对我来说是全新的,同时我试图把我的脑袋包裹在Umbraco的其他一切对我来说都是新的。通过跟踪和错误来学习。
提前感谢您的帮助。 丹
答案 0 :(得分: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() < 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() >= $currentPos and
position() < $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>