Xslt 1.0 是否可以使用模板参数设置禁用输出转义?
为什么以下内容在XSLT1.0中不起作用Xslt 1.0 是否可以使用模板参数设置禁用输出转义?,xslt-1.0,Xslt 1.0,为什么以下内容在XSLT1.0中不起作用 <xsl:template name="GenerateSummaryOld"> <xsl:param name="Content" /> <xsl:param name="Length" /> <xsl:param name="DisableOutputEscaping" /> <xsl:value-of select="substring($Content, 1, $Length
<xsl:template name="GenerateSummaryOld">
<xsl:param name="Content" />
<xsl:param name="Length" />
<xsl:param name="DisableOutputEscaping" />
<xsl:value-of select="substring($Content, 1, $Length)" disable-output-escaping="$DisableOutputEscaping" />
<xsl:if test="string-length($Content) > $Length"><i>...text has been shortened</i></xsl:if>
</xsl:template>
…文本已缩短
调用模板时,我使用以下命令:
<xsl:with-param name="DisableOutputEscaping">no</xsl:with-param>
否
我正在SharePoint内容查询web部件中尝试此操作,但出现web部件错误。如果在模板中硬编码禁用输出转义为“是”或“否”,则不会出现错误。简短回答:必须在XSLT样式表中按字面意思指定
禁用输出转义的值;它不能在样式表执行时计算
也就是说,您正在观察的行为是语言定义规定的行为
更长的回答:显示xsl:value的语法如下(或多或少):
注意这里的“字符串表达式”是斜体的;这意味着select
属性的值不是字符串“string expression
”,而是可以计算并强制为字符串的任何XPath表达式。但是禁用输出转义
的“是”和“否”没有斜体,没有描述为表达式,也没有描述为属性值模板。“是”或“否”值必须按字面意思给出
规范最接近于明确说明这一点(我可以找到)的是第7.6.2节中关于属性值模板的注释:
注意:并非所有属性都解释为属性值模板。值为表达式或模式的属性、顶级元素的属性和引用命名XSLT对象的属性不会解释为属性值模板
这是XSLT中的许多早期绑定约束之一,旨在确保样式表可以被编译,而不仅仅是被解释。C.M.Sperberg McQueen在“好答案”中给出了解释
以下是一个解决方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vAmp">&</xsl:variable>
<xsl:variable name="vYesNo" select="'yes'"/>
<xsl:template match="/">
<xsl:choose>
<xsl:when test="$vYesNo = 'yes'">
<xsl:value-of select="$vAmp" disable-output-escaping="yes"/>
</xsl:when>
<xsl:when test="$vYesNo = 'no'">
<xsl:value-of select="$vAmp" disable-output-escaping="no"/>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
如果我们更换:
<xsl:variable name="vYesNo" select="'yes'"/>
<xsl:variable name="vYesNo" select="'no'"/>
&
这是我必须使用的解决方案。我需要8行代码,而我应该能够在1分钟内完成它。哦,好吧。Thanx。@jeshort2,不客气。DOE是不受鼓励的,事实上它不是强制性的XSLT特性,而且一些XSLT处理器不实现DOE。通常我们会说,如果没有DOE,几乎没有什么事情是做不到的,但也许你的情况不同。我认为这个值必须进行硬编码,但我找不到任何明确的答案。非常感谢。
<xsl:variable name="vYesNo" select="'no'"/>
&