19 xml xslt escaping invalid-characters
我试图创建一个由&
符号分隔的变量赋值的查询字符串(例如:)"var1=x&var2=y&..."
.我计划将此字符串传递给嵌入式Flash文件.
我无法&
在XSLT中显示符号.如果我只输入&
没有标签,那么渲染XSLT文档就会出现问题.如果我键入&
时没有标签,那么文档的输出&
没有变化.如果我输入<xsl:value-of select="&" />
或<xsl:value-of select="&" />
我也收到错误.这可能吗?注意:我也尝试&amp;
过没有成功.
Kev*_*son 17
您可以结合disable-output-escaping
使用CDATA
部分.试试这个:
<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>
Run Code Online (Sandbox Code Playgroud)
Dim*_*hev 12
我试图创建一个由
&
符号分隔的变量赋值的查询字符串(例如:)"var1=x&var2=y&..."
.我计划将此字符串传递给嵌入式Flash文件.我无法
&
在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>
Run Code Online (Sandbox Code Playgroud)
当此转换应用于任何源XML文档(忽略)时:
<t/>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z
Run Code Online (Sandbox Code Playgroud)
至于问题中提出的其他问题:
如果我键入
&
时没有标签,那么文档的输出&
没有变化.
上述陈述根本不是真的......只需运行上面的转换并查看结果即可.
真正发生的事情:
您看到的结果是绝对正确的,但是您的输出方法是html
或xml
(默认值method=
),因此XSLT处理器的序列化程序必须表示正确的结果 - 字符串http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z
- 作为(部分)文本节点格式良好的XML文档或HTML树.
根据格式良好的XML文档中的定义,文字符号必须通过字符引用进行转义,例如内置的&
或者&
,或者&
请记住:表示为XML文本节点(的一部分)或HTML树中的字符串在表示为文本时可能看起来不像是相同的字符串.然而,这些是相同字符串的两种不同表示.
要更好地理解这个简单的事实,请执行以下操作:
采取上述转换并替换xsl:output
声明:
<xsl:output method="text"/>
Run Code Online (Sandbox Code Playgroud)
这一个:
<xsl:output method="xml"/>
Run Code Online (Sandbox Code Playgroud)
此外,将输出包围在单个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>
Run Code Online (Sandbox Code Playgroud)
结果是:
<t>http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z</t>
Run Code Online (Sandbox Code Playgroud)
您将使用输出方法获得相同的结果html
.
问题:
输出的URL是否与第一次转换中的输出不同(甚至"损坏")?
答案:
不,在两种情况下都输出相同的字符串 - 但是在每种情况下都使用了不同的字符串表示.
问题:
我必须使用DOE(disable-output-escaping="yes"
)属性才能输出所需的URL吗?
答案:
不,如第一次转型所示.
问题:
是否建议使用DOE(disable-output-escaping="yes"
)属性来输出所需的URL?
答案:
不,使用DOE在XSLT中是一种不好的做法,通常是程序员没有很好地掌握XSLT处理模型的信号.此外,DOE只是XSLT 1.0的一个可选功能,有可能您的XSLT处理器没有实现DOE,或者即使它实现了DOE,您可能会遇到与另一个XSLT处理器运行相同转换的问题.
题
我来自一个不同的问题,我提出了一个赏金的问题.我的问题:我尝试生成这个onclick方法:
Run Code Online (Sandbox Code Playgroud)<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>
Run Code Online (Sandbox Code Playgroud)
JavaScript(script.js):
function confirm(message) {
alert(message);
return message === 'are you sure?';
}
Run Code Online (Sandbox Code Playgroud)
当你运行它时,你将首先得到这个警报:
然后,在单击OK
按钮后,您将收到第二个警报:
点击后OK
你最终会获得产生&&
操作结果的警报:
您可以通过改变传递给confirm()
函数的参数的值来使用此代码,并验证生成的结果是否使用&&
运算符.
例如,如果将<input>
元素更改为:
<input type="submit"
onClick="alert(confirm('really sure?') && confirm('seriously?'));" />
Run Code Online (Sandbox Code Playgroud)
你会得到第一个这个警报:
当您单击时OK
,您将立即获得操作的最终结果&&
:
跳过第二个警报,因为操作的第一个操作数&&
是,false
并且JavaScript正在缩写&&
第一个操作数所在的位置false
.
总结一下:
&&
通过将&&
操作数指定为,可以很容易地在XSLT生成的HTML文档中的属性内使用运算符&&
小智 10
您是在HTML或XHTML中表达URI吗?例如,<tag attr="http://foo.bar/?key=value&key2=value2&..."/>
如果是这样," &
"是在属性值中表示&符号的正确方法,即使它看起来与您想要的文字URI不同.浏览器将&
在加载它们或将它们传递给Flash之前解码" "和任何其他字符实体引用.要嵌入文字,单独的" &
"直接在HTML或XHTML中是不正确的.
我个人也建议学习更多关于XML的知识,以便更清楚地思考这些事情.例如,尝试更多地使用W3C DOM(不仅仅是简单的Javascript); 即使您不是日常使用它,学习DOM也可以帮助我正确地思考XML的树结构以及如何正确地考虑编码属性和元素.
归档时间: |
|
查看次数: |
41172 次 |
最近记录: |