2011-08-28 16 views
0

我正在使用自定义ContentQueryMain.xsl开发自定义CQWP,我正在使用一个列表结构,我希望有一个分隔符可以为每个三项创建一个新列表。这里是模板的代码:XSLT因列表结构引发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">    
      </ul>      
     </li> 
     <li>       
      <ul class="separator"> 
          </xsl:if>     
      </xsl:for-each> 
      </ul>     
     </li>    
    </ul>   
</xsl:template> 

隔板是:

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

负责提出的web部件错误。下面的代码是可以正常使用:

<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> 

当我直接替换“分隔符”:在aspx页面

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

(编译后),一切都是完美的工作了。

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

非常感谢您

回答

1

的原因错误是显而易见的结束标记:任何XSLT样式表必须有一个良好的XML文档,这提供样式表ISN”吨。这就是为什么即使是XSLT处理器用来获取其样式表模块的XML解析器,也会产生非格式异常。

特别地,该片段:

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

心不是一个良好的XML片段,becausethere不是用于结束标记</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> 
0

达到你所要求的功能的唯一方式是通过你的建议选择2放在XSL文本的所有结束标记和渲染。 其他明智的,你不能plase中是否会被视为错误条件

+0

事实上,我刚刚尝试过没有(这意味着我已将分隔符放在每个项目中)的情况相同,并且发生完全相同的情况,因此问题不是来自if语句 – Holden

+0

哦,确定它正在工作! – Holden

+0

thts grtt :)我同意Dimitre Novatchev的声明,这就是为什么我已经为您提供了相同的解决方法 –

-3

我已经找到了解决办法:

事实上,问题是里面的for-each,你不能插入无与伦比的标签,因此,要做到这一点,你必须将它们包装成:

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

您完全无法看到问题的* root *,而这个所谓的“解决方案”是一种尝试,症状。尽量避免使用DOE,因为它会破坏XSLT体系结构模式,它很丑陋,DOE功能不是强制性的,并且不保证在所有XSLT处理器上都支持。要明白,XSLT适用于*节点*而不适用于“标签” - 您不能在这里拥有“半个节点”,在这里不能拥有“半个节点”。 –

+0

好吧,我现在明白了,非常感谢 – Holden

1

在表面层次上,您的样式表是无效的,因为它不是格式良好的XML。

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

你的问题是一个分组问题。在XSLT 2.0中分组问题比在1.0中更容易解决 - 但即使在1.0中,解决方案也始终可能实现,而不脱离XSLT处理模型。