无法使用xsl:if来控制标签的显示

时间:2014-04-04 20:24:29

标签: xslt

我正在尝试使用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>

1 个答案:

答案 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属性,或者添加一个空单元格。