3

为什么以下在 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 部件错误。如果我在模板中将禁用输出转义硬编码为“是”或“否”,则不会出现错误。

4

2 回答 2

2

简短的回答:disable-output-escaping必须在 XSLT 样式表中按字面意思指定 的值;它不能在样式表执行时计算。

也就是说,您所观察到的行为是语言定义所规定的行为。

更长的答案: XSLT 1.0 规范显示了这样的语法xsl:value-of(或多或少):

  <!-- 分类:指令 -->
  <xsl:value-of
       选择 =字符串表达式
       禁用输出转义=“是”| “没有” />

注意这里的“string-expression”是斜体的;这意味着该select属性的值不是字符串“ string-expression”,而是任何可以评估并强制转换为字符串的 XPath 表达式。但是其中的“是”和“否”disable-output-escaping没有斜体,没有描述为表达式,也没有描述为属性值模板。“是”或“否”值必须按字面意思给出。

最接近规范明确说明(我能找到)的是第 7.6.2 节中关于属性值模板的注释:

注意:并非所有属性都被解释为属性值模板。值为表达式或模式的属性、顶级元素的属性和引用命名 XSLT 对象的属性不会被解释为属性值模板。...

这是 XSLT 中的许多早期绑定约束之一,旨在确保样式表可以被编译而不仅仅是解释。

于 2012-12-18T02:16:25.957 回答
1

CM 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;
于 2012-12-18T04:53:36.137 回答