20

我正在尝试创建一个由&符号分隔的变量赋值查询字符串(例如:)"var1=x&var2=y&..."。我计划将此字符串传递到嵌入式闪存文件中。

我无法让&符号显示在 XSLT 中。如果我只是&在其周围没有任何标签的情况下键入,则呈现 XSLT 文档时会出现问题。如果我&amp;在其周围没有任何标签键入,则文档的输出&amp;没有变化。如果我输入<xsl:value-of select="&" /><xsl:value-of select="&amp;" />我也会收到错误。这可能吗?注意:我也尝试过&amp;amp;,但没有成功。

4

13 回答 13

17

您可以disable-output-escaping与一个CDATA部分组合。尝试这个:

<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>
于 2008-09-26T22:48:59.317 回答
14

我正在尝试创建一个由&符号分隔的变量赋值查询字符串(例如:)"var1=x&var2=y&..."。我计划将此字符串传递到嵌入式闪存文件中。

我无法让&符号显示在 XSLT 中。

这是一个可运行的、简短且完整的演示如何生成这样的 URL:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vX" select="'x'"/>
 <xsl:variable name="vY" select="'y'"/>
 <xsl:variable name="vZ" select="'z'"/>

  <xsl:template match="/">
    <xsl:value-of select=
"concat('http://www.myUrl.com/?vA=a&amp;vX=', $vX, '&amp;vY=', $vY, '&amp;vZ=', $vZ)"/>
  </xsl:template>
</xsl:stylesheet>

当此转换应用于任何源 XML 文档(忽略)时

<t/>

产生了想要的正确结果:

http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z

至于问题中提出的其他问题:

如果我&amp;在其周围没有任何标签键入,则文档的输出&amp;没有变化。

上面的说法根本不正确......只需运行上面的转换并查看结果。

真正发生了什么

您看到的结果是绝对正确的,但是您的输出方法是htmlor xml(的默认值method=),因此 XSLT 处理器的序列化程序必须将正确的结果 - 字符串http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z - 表示为 a 中的文本节点(的一部分)格式良好的 XML 文档或 HTML 树中。

根据在格式良好的 XML 文档中的定义,文字 & 符号必须通过字符引用进行转义,例如内置的&amp;or &#38;, 或&#x26;

请记住:表示为 XML 文本节点(部分)或 HTML 树中的字符串在表示为文本时可能看起来不像相同的字符串。然而,这是同一字符串的两种不同表示形式。

为了更好地理解这个简单的事实,请执行以下操作

取上述变换,替换xsl:output声明:

 <xsl:output method="text"/>

有了这个:

 <xsl:output method="xml"/>

此外,将输出包含在单个 XML 元素中。您也可以尝试对 & 符号使用不同的转义符。转换现在可能如下所示:

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" method="xml"/>

 <xsl:variable name="vX" select="'x'"/>
 <xsl:variable name="vY" select="'y'"/>
 <xsl:variable name="vZ" select="'z'"/>

  <xsl:template match="/">
        <t>
            <xsl:value-of select=
 "concat('http://www.myUrl.com/?vA=a&amp;vX=', $vX, '&#38;vY=', $vY, '&#x26;vZ=', $vZ)"/>
        </t>
  </xsl:template>
</xsl:stylesheet>

结果是

<t>http://www.myUrl.com/?vA=a&amp;vX=x&amp;vY=y&amp;vZ=z</t>

您将使用 output method 获得相同的结果html

问题

输出的 URL 是否与第一次转换中的输出不同(甚至“损坏”)?

答案

不,在这两种情况下都输出了相同的字符串——但是在每种情况下都使用了不同的字符串表示形式

问题

disable-output-escaping="yes"为了输出想要的 URL,我必须使用 DOE ( ) 属性吗?

答案

不,如第一次转换所示。

问题

是否建议使用 DOE ( disable-output-escaping="yes") 属性来输出所需的 URL?

答案

不,在 XSLT 中使用 DOE 是一种不好的做法,通常表明程序员没有很好地掌握 XSLT 处理模型。此外,DOE 只是 XSLT 1.0 的一个可选功能,您的 XSLT 处理器可能没有实现 DOE,或者即使它实现了,您也可能在使用另一个 XSLT 处理器运行相同的转换时遇到问题。

问题

我来自一个与我悬赏的问题不同的问题。我的问题:我尝试生成这个 onclick 方法:

    <input type="submit" 
onClick="return confirm('are you sure?') && confirm('seriously?');" />

我能做的是:我可以将确认放在一个函数中......但它让我烦恼的是我不能在一个属性内制作 & !这个问题的解决就是我认为的问题的解决。

回答

实际上,您可以&&在属性内的 JavaScript 表达式中指定布尔运算,将其表示为&amp;&amp;

这是一个完整的示例,每个人都可以运行,就像我在三个浏览器上所做的那样:Chrome、Firefox 41.1.01 和 IE11:

HTML

<!DOCTYPE html> 

    <html> 
      <head> 
        <link rel="stylesheet" href="style.css"> 
        <script src="script.js"></script> 
      </head> 
      <body> 
        <h1>Hello Plunker!</h1> 
        <input type="submit" 
onClick="alert(confirm('are you sure?') &amp;&amp; confirm('seriously?'));" /> 
      </body> 
    </html>

JavaScript (script.js):

function confirm(message) { 
  alert(message); 
  return message === 'are you sure?'; 

}

运行此程序时,您将首先收到此警报:

在此处输入图像描述

然后,单击OK按钮后,您将收到第二个警报:

在此处输入图像描述

单击后,OK您将最终获得产生&&操作结果的警报:

在此处输入图像描述

您可以通过改变传递给confirm()函数的参数的值来使用此代码,并且您将验证生成的结果是使用&&运算符的结果。

例如,如果您将<input>元素更改为:

<input type="submit" 
onClick="alert(confirm('really sure?') &amp;&amp; confirm('seriously?'));" /> 

您将首先收到此警报:

在此处输入图像描述

而当你点击 时OK,你会立即得到&&运行的最终结果:

在此处输入图像描述

第二个警报被跳过,因为操作的第一个操作数&&wasfalse并且 JavaScript 正在缩短&&第一个操作数 is的位置false

总结一下

&&XSLT 生成的 HTML 文档中,通过将&&操作数指定为&amp;&amp;

于 2015-10-13T03:29:02.430 回答
11

您是用 HTML 还是 XHTML 表示 URI?例如<tag attr="http://foo.bar/?key=value&amp;key2=value2&amp;..."/> ,如果是这样," &amp;" 是在属性值中表示 & 符号的正确方法,即使它看起来与您想要的文字 URI 不同。&amp;浏览器将在加载“”和任何其他字符实体引用或将它们传递给 Flash 之前对其进行解码。要嵌入文字,&直接在 HTML 或 XHTML 中单独使用“”是不正确的。

我个人还建议学习更多有关 XML 的知识,以便以更清晰的方式思考这些事情。例如,尝试更多地使用 W3C DOM(不仅仅是简单的 Javascript);即使您不是日常使用它,学习 DOM 也帮助我正确地思考 XML 的树形结构以及如何正确地思考属性和元素的编码。

于 2008-09-15T23:27:43.763 回答
6

disable-output-escaping="yes"在您的value-of标签中使用

于 2008-09-15T23:15:04.980 回答
4

如果您在某个其他标记(如“embed”)的属性中创建一个查询字符串作为较大 URL 的一部分,那么您实际上希望将 & 转义为 &。虽然所有浏览器都会弄清楚您的意思并做正确的事,但如果您要将生成的文档传递给验证器,它将在属性值中标记未转义的 &。

于 2008-09-15T23:26:13.457 回答
4

如果您尝试生成 XML 文件作为输出,您将需要生成&amp;(因为&它本身是无效的 XML)。如果您只是生成一个字符串,那么您应该将样式表的输出模式设置为text通过包含以下内容作为xsl:stylesheet

<xsl:output method="text"/>

这将防止样式表逃逸并且<xsl:value-of select="'&amp;'" />应该生成&.

于 2008-09-16T11:14:23.847 回答
3

如果您的转换正在发出 XML 文档,则不应禁用输出转义。您希望在输出中对标记字符进行转义,以免发出格式错误的 XML。您用来处理输出的 XML 对象(例如 DOM)将为您取消转义文本。

如果您使用字符串操作而不是 XML 对象来处理输出,那么您就会遇到问题。但问题不在于您的 XSLT,而在于使用字符串操作来处理 XML 的决定,这几乎总是一个糟糕的决定。

如果您的转换正在发出 HTML 或文本(并且您已在<xsl:output>元素上设置了输出类型,对吗?),情况就不同了。然后它适合disable-output-escaping='yes'在您的<xsl:value-of>元素上使用。

但在任何情况下,您都需要对 XSLT 文本节点中的标记字符进行转义,除非您已将文本包装在 CDATA 部分中。

于 2008-10-08T00:24:42.503 回答
1

禁用输出转义将完成这项工作......因为此属性仅支持文本,您也可以操作模板,例如:

 <xsl:variable name="replaced">

    <xsl:call-template name='app'>
      <xsl:with-param name='name'/>       
    </xsl:call-template>
  </xsl:variable>


<xsl:value-of select="$replaced" disable-output-escaping="yes"/>

---> 将模板调用包装在一个变量中并使用 disable-output-escaping="yes"..

于 2014-06-03T09:40:44.913 回答
1

只需将 & 替换为

<![CDATA[&]]>

在数据中。例如:数据 XML

<title>Empire <![CDATA[&]]> Burlesque</title>

XSLT 标记:

<xsl:value-of select="title" />

输出:帝国与滑稽剧

于 2016-02-16T10:14:52.320 回答
0

您应该注意,您可以在节点或字符串/文本的值中使用禁用输出转义,例如:

<xsl:value-of select="/node/here" disable-output-escaping="yes" />

或者

<xsl:value-of select="'&amp;'" disable-output-escaping="yes" />
<xsl:text disable-output-escaping="yes">Texas A&amp;M</xsl:text>

注意 xsl:value-of 中的单引号。

但是,您不能对属性使用禁用输出转义。我知道这完全搞砸了,但是这就是 XSLT 1.0 中的情况。所以以下将不起作用

<xsl:value-of select="/node/here/@ttribute" disable-output-escaping="yes" />

因为在细则中是报价:

因此,禁用用于生成注释、处理指令或 属性节点的字符串值的or 元素的输出转义是错误的;<xsl:value-of /><xsl:text />

强调我的。

取自:http ://www.w3.org/TR/xslt#disable-output-escaping

于 2008-09-17T19:51:04.423 回答
0

使用disable-output-escaping属性(布尔值)可能是完成此任务的最简单方法。请注意,您不仅可以使用它,还可以使用它<xsl:value-of/><xsl:text>这可能更干净,具体取决于您的具体情况。

这是规范的相关部分:http: //www.w3.org/TR/xslt#disable-output-escaping

于 2008-09-15T23:18:52.757 回答
0

org.apache.xalan.xslt.Process,版本 2.7.2 输出到上面提到的“这是一个可运行的、简短且完整的演示如何生成这样的 URL”:

<?xml version="1.0" encoding="UTF-8"?>http://www.myUrl.com/?vA=a&amp;vX=x&amp;vY=y&amp;vZ=z11522

XML 声明被一个附加的 抑制omit-xml-declaration="yes",但是输出method="text"转义与号是不合理的。

于 2019-01-25T08:34:57.030 回答
-3

尝试:<xsl:value-of select="&" 禁用输出转义=“是”/>

很抱歉,如果格式混乱。

于 2008-09-15T23:18:03.727 回答