由于列表结构,XSLT引发Web部件错误

时间:2011-08-28 09:07:32

标签: sharepoint xslt web-parts

我正在使用自定义ContentQueryMain.xsl开发自定义CQWP,我正在使用一个列表结构,我希望有一个分隔符,每三个项目创建一个新列表。以下是模板的代码:

<xsl:template name="CustomGroupTemplateSimple2">
    <ul>                    
        <li>
            <ul class="liste1">                             
            <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>  
            <xsl:for-each select="$Rows">
            <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>            
                <li>
                    test                    
                </li>
                          <xsl:if test="position() mod 3 = 0">              
            </ul>                     
        </li>
        <li>                        
            <ul class="separator">
                          </xsl:if>                 
            </xsl:for-each>
            </ul>                   
        </li>               
    </ul>           
</xsl:template>

分隔符为:

     </ul>                     
</li>                     
<li>                        
     <ul class="separator">

负责引发的webpart错误。以下代码完美运行:

<xsl:template name="CustomGroupTemplateSimple2">
    <ul>                    
        <li>
            <ul class="liste1">                             
            <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>  
            <xsl:for-each select="$Rows">
            <xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>            
                <li>
                    test                    
                </li>
                          <xsl:if test="position() mod 3 = 0">                  
            SEPARATOR
                          </xsl:if>                 
            </xsl:for-each>
            </ul>                   
        </li>               
    </ul>           
</xsl:template>

当我直接用“

”替换“SEPARATOR”时
     </ul>                     
</li>                     
<li>                        
     <ul class="separator">

在aspx页面中(编译后),一切都很完美。

因此,我真的迷失了这种情况,因为我真的需要这个分隔符。

非常感谢

4 个答案:

答案 0 :(得分:1)

错误的原因很明显:任何XSLT样式表必须是格式良好的XML文档,而提供的样式表不是。这就是为什么即使是XSLT处理器用来获取样式表模块的XML解析器,也会引发一个非格式异常。

特别是这个片段:

        <xsl:if test="position() mod 3 = 0">
                    </ul>
                   </li>
                   <li>
             <ul class="separator">
        </xsl:if>

不是格式良好的XML片段,因为结尾标记</ul></li>没有任何开始标记。

最后,这是一个正确的位置分组示例

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="num[position() mod 3 = 1]">
  <group>
   <xsl:copy-of select=
    ". | following-sibling::*[not(position() > 2)]"/>
  </group>
 </xsl:template>

 <xsl:template match="num"/>
</xsl:stylesheet>

将此转换应用于以下XML文档

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

生成了正确分组的结果

<nums>
   <group>
      <num>01</num>
      <num>02</num>
      <num>03</num>
   </group>
   <group>
      <num>04</num>
      <num>05</num>
      <num>06</num>
   </group>
   <group>
      <num>07</num>
      <num>08</num>
      <num>09</num>
   </group>
   <group>
      <num>10</num>
   </group>
</nums>

答案 1 :(得分:1)

在表面级别,样式表无效,因为它不是格式良好的XML。

在更深层次上,您无法理解XSLT将XML作为节点树处理。您试图将<a></a>视为两个单独的指令,其中一个将开始标记写入输出,另一个将结束标记写入输出。这是XSLT如何工作的错误心理模型。实际上<a>...</a>是样式表中元素节点的词汇表示;样式表中的元素节点是单个指令,其评估时的效果是将元素节点写入结果树。节点是不可分割的,您无法将节点写入的操作分成两部分,每部分写入一半节点。

您的问题是分组问题。在XSLT 2.0中,分组问题比在1.0中更容易解决 - 但是在不偏离XSLT处理模型的情况下,即使在1.0中也可以使用解决方案。

答案 2 :(得分:0)

实现您要求的功能的唯一方法是建议选项2,将所有结束标记放在xsl文本中并进行渲染。 另外,如果条件被视为错误

,则无法使用结束标记

答案 3 :(得分:-3)

我找到了解决方案:

实际上问题是在for-each中,你不能插入不匹配的标签,因此,你必须将它们包装成:

<xsl:text disable-output-escaping="yes"><![CDATA[ 
  any HTML in here will not be validated 
]]></xsl:text>