可以使用模板参数设置disable-output-escaping吗?

时间:2012-12-17 23:45:21

标签: 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)" disable-output-escaping="$DisableOutputEscaping" />
  <xsl:if test="string-length($Content) &gt; $Length"><i>...text has been shortened</i></xsl:if>
</xsl:template>

调用模板时我正在使用以下内容:

<xsl:with-param name="DisableOutputEscaping">no</xsl:with-param>

我在SharePoint内容查询WebPart中尝试此操作,但是我收到了Web部件错误。如果我在模板中将禁用输出转义硬编码为“是”或“否”,则不会出现错误。

2 个答案:

答案 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">&amp;</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'"/>

现在修改后的转化的结果是

&amp;