我正在使用自定义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页面中(编译后),一切都很完美。
因此,我真的迷失了这种情况,因为我真的需要这个分隔符。
非常感谢
答案 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>