我正在尝试创建一个由&
符号分隔的变量赋值查询字符串(例如:)"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&vX=', $vX, '&vY=', $vY, '&vZ=', $vZ)"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于任何源 XML 文档(忽略)时:
<t/>
产生了想要的正确结果:
http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z
至于问题中提出的其他问题:
如果我&
在其周围没有任何标签键入,则文档的输出&
没有变化。
上面的说法根本不正确......只需运行上面的转换并查看结果。
真正发生了什么:
您看到的结果是绝对正确的,但是您的输出方法是html
or xml
(的默认值method=
),因此 XSLT 处理器的序列化程序必须将正确的结果 - 字符串http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z
- 表示为 a 中的文本节点(的一部分)格式良好的 XML 文档或 HTML 树中。
根据在格式良好的 XML 文档中的定义,文字 & 符号必须通过字符引用进行转义,例如内置的&
or &
, 或&
请记住:表示为 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&vX=', $vX, '&vY=', $vY, '&vZ=', $vZ)"/>
</t>
</xsl:template>
</xsl:stylesheet>
结果是:
<t>http://www.myUrl.com/?vA=a&vX=x&vY=y&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 表达式中指定布尔运算,将其表示为&&
这是一个完整的示例,每个人都可以运行,就像我在三个浏览器上所做的那样: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?') && 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?') && confirm('seriously?'));" />
您将首先收到此警报:
而当你点击 时OK
,你会立即得到&&
运行的最终结果:
第二个警报被跳过,因为操作的第一个操作数&&
wasfalse
并且 JavaScript 正在缩短&&
第一个操作数 is的位置false
。
总结一下:
在&&
XSLT 生成的 HTML 文档中,通过将&&
操作数指定为&&