我正在尝试使用xsl创建自定义sharepoint网页。在这个网页中,我需要显示一个每行有两个记录的列表。以下是我提出的代码。但是当我尝试访问该页面时,该页面无法显示。仅当我删除用于控制标记显示的代码时,它才有效。这个if条件导致页面失败的原因是什么?
<xsl:template match="/" xmlns:x="http://www.w3.org/2001/XMLSchema">
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row" />
<table>
<xsl:for-each select="$Rows">
<xsl:call-template name="menu.rowview" />
</xsl:for-each>
</table>
</xsl:template>
<xsl:template name="menu.rowview">
<!-- two record per table row -->
<xsl:if test="position() mod 2 = 1" >
<tr>
</xsl:if>
<td>
<span><xsl:value-of select="@MenuDesc" /></span>
</td>
<!-- two record per table row -->
<xsl:if test="position() mod 2 = 1" >
</tr>
</xsl:if>
</xsl:template>
答案 0 :(得分:0)
正如Lingamurthy CS所提到的,XSLT需要是一个格式良好的XML文档,而你的目前并不是因为这样的行......
<xsl:if test="position() mod 2 = 1" >
<tr>
</xsl:if>
您尝试使用XSLT进行的操作是一个相当常见的问题。您需要采取的方法是首先选择行元素,这些元素是您希望输出的每个“行”的开头:
<xsl:for-each select="$Rows[position() mod 2 = 1]">
然后,您可以通过输出当前行和后续
输出两个“单元格” <tr>
<td>
<span>
<xsl:value-of select="@MenuDesc"/>
</span>
</td>
<td>
<span>
<xsl:value-of select="following-sibling::Row[1]/@MenuDesc"/>
</span>
</td>
</tr>
当然,这里有一些代码重复,所以你可以更好地利用模板重复使用。试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>
<table>
<xsl:for-each select="$Rows[position() mod 2 = 1]">
<tr>
<xsl:apply-templates select="self::*|following-sibling::Row[1]"/>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="Row">
<td>
<span>
<xsl:value-of select="@MenuDesc"/>
</span>
</td>
</xsl:template>
</xsl:stylesheet>
你可能需要修改它来处理奇数个单元格(并且最后一行中只有一个单元格),或者通过向最终单元格添加colspan属性,或者添加一个空单元格。