Xslt 1.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

为什么以下内容在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内容查询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">&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>
如果我们更换

 <xsl:variable name="vYesNo" select="'yes'"/>
 <xsl:variable name="vYesNo" select="'no'"/>
&amp;

这是我必须使用的解决方案。我需要8行代码,而我应该能够在1分钟内完成它。哦,好吧。Thanx。@jeshort2,不客气。DOE是不受鼓励的,事实上它不是强制性的XSLT特性,而且一些XSLT处理器不实现DOE。通常我们会说,如果没有DOE,几乎没有什么事情是做不到的,但也许你的情况不同。我认为这个值必须进行硬编码,但我找不到任何明确的答案。非常感谢。
 <xsl:variable name="vYesNo" select="'no'"/>
&amp;