为什么以下不能在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)" 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内容查询WebPart中尝试此操作,但是我收到了Web部件错误。如果我在模板中将禁用输出转义硬编码为“是”或“否”,则不会出现错误。
答案 0 :(得分:2)
简答: disable-output-escaping
的值必须在XSLT样式表中按字面指定;它无法在样式表执行时计算。
也就是说,您观察的行为是语言定义规定的行为。
更长的答案:XSLT 1.0 spec显示xsl:value-of
的语法(或多或少):
<!-- Category: instruction --> <xsl:value-of select = string-expression disable-output-escaping = "yes" | "no" />
请注意,“string-expression”在这里用斜体表示;这意味着select
属性的值不是字符串“string-expression
”,而是任何可以计算和强制转换为字符串的XPath表达式。但disable-output-escaping
的“是”和“否”不是斜体,不是描述为表达式,也不是描述为属性值模板。必须按字面意思给出“是”或“否”值。
规范最接近明确说明(我能找到)是关于属性值模板的7.6.2节中的注释:
注意:并非所有属性都被解释为属性值模板。其值为表达式或模式的属性,顶级元素的属性和引用命名的XSLT对象的属性不会被解释为属性值模板。 ...
这是XSLT中许多早期绑定约束之一,旨在确保样式表可以编译而不仅仅是解释。
答案 1 :(得分:1)
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>
当此转换应用于任何XML文档(未使用)时,结果为:
&
如果我们更换:
<xsl:variable name="vYesNo" select="'yes'"/>
<强>与强>:
<xsl:variable name="vYesNo" select="'no'"/>
现在修改后的转化的结果是:
&